1 //===------------------------- locale.cpp ---------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // On Solaris, we need to define something to make the C99 parts of localeconv
22 #ifndef _LIBCPP_NO_EXCEPTIONS
23 # include "type_traits"
28 #include "__sso_allocator"
29 #if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
30 #include "support/win32/locale_win32.h"
31 #elif !defined(__ANDROID__)
37 // On Linux, wint_t and wchar_t have different signed-ness, and this causes
38 // lots of noise in the build log, but no bugs that I know of.
39 #if defined(__clang__)
40 #pragma clang diagnostic ignored "-Wsign-conversion"
43 _LIBCPP_BEGIN_NAMESPACE_STD
47 // In theory this could create a race condition. In practice
48 // the race condition is non-fatal since it will just create
49 // a little resource leak. Better approach would be appreciated.
50 static locale_t result = newlocale(LC_ALL_MASK, "C", 0);
53 #endif // __cloc_defined
59 void operator()(locale::facet* p) {p->__release_shared();}
62 template <class T, class A0>
67 static typename aligned_storage<sizeof(T)>::type buf;
69 return *reinterpret_cast<T*>(&buf);
72 template <class T, class A0, class A1>
77 static typename aligned_storage<sizeof(T)>::type buf;
78 ::new (&buf) T(a0, a1);
79 return *reinterpret_cast<T*>(&buf);
82 template <class T, class A0, class A1, class A2>
85 make(A0 a0, A1 a1, A2 a2)
87 static typename aligned_storage<sizeof(T)>::type buf;
88 ::new (&buf) T(a0, a1, a2);
89 return *reinterpret_cast<T*>(&buf);
92 template <typename T, size_t N>
96 countof(const T (&)[N])
101 template <typename T>
105 countof(const T * const begin, const T * const end)
107 return static_cast<size_t>(end - begin);
113 // Set priority to INT_MIN + 256 + 150
114 # pragma priority ( -2147483242 )
117 const locale::category locale::none;
118 const locale::category locale::collate;
119 const locale::category locale::ctype;
120 const locale::category locale::monetary;
121 const locale::category locale::numeric;
122 const locale::category locale::time;
123 const locale::category locale::messages;
124 const locale::category locale::all;
126 class _LIBCPP_HIDDEN locale::__imp
130 #if defined(_LIBCPP_MSVC)
131 // FIXME: MSVC doesn't support aligned parameters by value.
132 // I can't get the __sso_allocator to work here
133 // for MSVC I think for this reason.
134 vector<facet*> facets_;
136 vector<facet*, __sso_allocator<facet*, N> > facets_;
140 explicit __imp(size_t refs = 0);
141 explicit __imp(const string& name, size_t refs = 0);
143 __imp(const __imp&, const string&, locale::category c);
144 __imp(const __imp& other, const __imp& one, locale::category c);
145 __imp(const __imp&, facet* f, long id);
148 const string& name() const {return name_;}
149 bool has_facet(long id) const
150 {return static_cast<size_t>(id) < facets_.size() && facets_[static_cast<size_t>(id)];}
151 const locale::facet* use_facet(long id) const;
153 static const locale& make_classic();
154 static locale& make_global();
156 void install(facet* f, long id);
157 template <class F> void install(F* f) {install(f, f->id.__get());}
158 template <class F> void install_from(const __imp& other);
161 locale::__imp::__imp(size_t refs)
167 install(&make<_VSTD::collate<char> >(1u));
168 install(&make<_VSTD::collate<wchar_t> >(1u));
169 install(&make<_VSTD::ctype<char> >(nullptr, false, 1u));
170 install(&make<_VSTD::ctype<wchar_t> >(1u));
171 install(&make<codecvt<char, char, mbstate_t> >(1u));
172 install(&make<codecvt<wchar_t, char, mbstate_t> >(1u));
173 install(&make<codecvt<char16_t, char, mbstate_t> >(1u));
174 install(&make<codecvt<char32_t, char, mbstate_t> >(1u));
175 install(&make<numpunct<char> >(1u));
176 install(&make<numpunct<wchar_t> >(1u));
177 install(&make<num_get<char> >(1u));
178 install(&make<num_get<wchar_t> >(1u));
179 install(&make<num_put<char> >(1u));
180 install(&make<num_put<wchar_t> >(1u));
181 install(&make<moneypunct<char, false> >(1u));
182 install(&make<moneypunct<char, true> >(1u));
183 install(&make<moneypunct<wchar_t, false> >(1u));
184 install(&make<moneypunct<wchar_t, true> >(1u));
185 install(&make<money_get<char> >(1u));
186 install(&make<money_get<wchar_t> >(1u));
187 install(&make<money_put<char> >(1u));
188 install(&make<money_put<wchar_t> >(1u));
189 install(&make<time_get<char> >(1u));
190 install(&make<time_get<wchar_t> >(1u));
191 install(&make<time_put<char> >(1u));
192 install(&make<time_put<wchar_t> >(1u));
193 install(&make<_VSTD::messages<char> >(1u));
194 install(&make<_VSTD::messages<wchar_t> >(1u));
197 locale::__imp::__imp(const string& name, size_t refs)
202 #ifndef _LIBCPP_NO_EXCEPTIONS
205 #endif // _LIBCPP_NO_EXCEPTIONS
206 facets_ = locale::classic().__locale_->facets_;
207 for (unsigned i = 0; i < facets_.size(); ++i)
209 facets_[i]->__add_shared();
210 install(new collate_byname<char>(name_));
211 install(new collate_byname<wchar_t>(name_));
212 install(new ctype_byname<char>(name_));
213 install(new ctype_byname<wchar_t>(name_));
214 install(new codecvt_byname<char, char, mbstate_t>(name_));
215 install(new codecvt_byname<wchar_t, char, mbstate_t>(name_));
216 install(new codecvt_byname<char16_t, char, mbstate_t>(name_));
217 install(new codecvt_byname<char32_t, char, mbstate_t>(name_));
218 install(new numpunct_byname<char>(name_));
219 install(new numpunct_byname<wchar_t>(name_));
220 install(new moneypunct_byname<char, false>(name_));
221 install(new moneypunct_byname<char, true>(name_));
222 install(new moneypunct_byname<wchar_t, false>(name_));
223 install(new moneypunct_byname<wchar_t, true>(name_));
224 install(new time_get_byname<char>(name_));
225 install(new time_get_byname<wchar_t>(name_));
226 install(new time_put_byname<char>(name_));
227 install(new time_put_byname<wchar_t>(name_));
228 install(new messages_byname<char>(name_));
229 install(new messages_byname<wchar_t>(name_));
230 #ifndef _LIBCPP_NO_EXCEPTIONS
234 for (unsigned i = 0; i < facets_.size(); ++i)
236 facets_[i]->__release_shared();
239 #endif // _LIBCPP_NO_EXCEPTIONS
242 // NOTE avoid the `base class should be explicitly initialized in the
243 // copy constructor` warning emitted by GCC
244 #if defined(__clang__) || _GNUC_VER >= 406
245 #pragma GCC diagnostic push
246 #pragma GCC diagnostic ignored "-Wextra"
249 locale::__imp::__imp(const __imp& other)
250 : facets_(max<size_t>(N, other.facets_.size())),
253 facets_ = other.facets_;
254 for (unsigned i = 0; i < facets_.size(); ++i)
256 facets_[i]->__add_shared();
259 #if defined(__clang__) || _GNUC_VER >= 406
260 #pragma GCC diagnostic pop
263 locale::__imp::__imp(const __imp& other, const string& name, locale::category c)
267 facets_ = other.facets_;
268 for (unsigned i = 0; i < facets_.size(); ++i)
270 facets_[i]->__add_shared();
271 #ifndef _LIBCPP_NO_EXCEPTIONS
274 #endif // _LIBCPP_NO_EXCEPTIONS
275 if (c & locale::collate)
277 install(new collate_byname<char>(name));
278 install(new collate_byname<wchar_t>(name));
280 if (c & locale::ctype)
282 install(new ctype_byname<char>(name));
283 install(new ctype_byname<wchar_t>(name));
284 install(new codecvt_byname<char, char, mbstate_t>(name));
285 install(new codecvt_byname<wchar_t, char, mbstate_t>(name));
286 install(new codecvt_byname<char16_t, char, mbstate_t>(name));
287 install(new codecvt_byname<char32_t, char, mbstate_t>(name));
289 if (c & locale::monetary)
291 install(new moneypunct_byname<char, false>(name));
292 install(new moneypunct_byname<char, true>(name));
293 install(new moneypunct_byname<wchar_t, false>(name));
294 install(new moneypunct_byname<wchar_t, true>(name));
296 if (c & locale::numeric)
298 install(new numpunct_byname<char>(name));
299 install(new numpunct_byname<wchar_t>(name));
301 if (c & locale::time)
303 install(new time_get_byname<char>(name));
304 install(new time_get_byname<wchar_t>(name));
305 install(new time_put_byname<char>(name));
306 install(new time_put_byname<wchar_t>(name));
308 if (c & locale::messages)
310 install(new messages_byname<char>(name));
311 install(new messages_byname<wchar_t>(name));
313 #ifndef _LIBCPP_NO_EXCEPTIONS
317 for (unsigned i = 0; i < facets_.size(); ++i)
319 facets_[i]->__release_shared();
322 #endif // _LIBCPP_NO_EXCEPTIONS
328 locale::__imp::install_from(const locale::__imp& one)
330 long id = F::id.__get();
331 install(const_cast<F*>(static_cast<const F*>(one.use_facet(id))), id);
334 locale::__imp::__imp(const __imp& other, const __imp& one, locale::category c)
338 facets_ = other.facets_;
339 for (unsigned i = 0; i < facets_.size(); ++i)
341 facets_[i]->__add_shared();
342 #ifndef _LIBCPP_NO_EXCEPTIONS
345 #endif // _LIBCPP_NO_EXCEPTIONS
346 if (c & locale::collate)
348 install_from<_VSTD::collate<char> >(one);
349 install_from<_VSTD::collate<wchar_t> >(one);
351 if (c & locale::ctype)
353 install_from<_VSTD::ctype<char> >(one);
354 install_from<_VSTD::ctype<wchar_t> >(one);
355 install_from<_VSTD::codecvt<char, char, mbstate_t> >(one);
356 install_from<_VSTD::codecvt<char16_t, char, mbstate_t> >(one);
357 install_from<_VSTD::codecvt<char32_t, char, mbstate_t> >(one);
358 install_from<_VSTD::codecvt<wchar_t, char, mbstate_t> >(one);
360 if (c & locale::monetary)
362 install_from<moneypunct<char, false> >(one);
363 install_from<moneypunct<char, true> >(one);
364 install_from<moneypunct<wchar_t, false> >(one);
365 install_from<moneypunct<wchar_t, true> >(one);
366 install_from<money_get<char> >(one);
367 install_from<money_get<wchar_t> >(one);
368 install_from<money_put<char> >(one);
369 install_from<money_put<wchar_t> >(one);
371 if (c & locale::numeric)
373 install_from<numpunct<char> >(one);
374 install_from<numpunct<wchar_t> >(one);
375 install_from<num_get<char> >(one);
376 install_from<num_get<wchar_t> >(one);
377 install_from<num_put<char> >(one);
378 install_from<num_put<wchar_t> >(one);
380 if (c & locale::time)
382 install_from<time_get<char> >(one);
383 install_from<time_get<wchar_t> >(one);
384 install_from<time_put<char> >(one);
385 install_from<time_put<wchar_t> >(one);
387 if (c & locale::messages)
389 install_from<_VSTD::messages<char> >(one);
390 install_from<_VSTD::messages<wchar_t> >(one);
392 #ifndef _LIBCPP_NO_EXCEPTIONS
396 for (unsigned i = 0; i < facets_.size(); ++i)
398 facets_[i]->__release_shared();
401 #endif // _LIBCPP_NO_EXCEPTIONS
404 locale::__imp::__imp(const __imp& other, facet* f, long id)
405 : facets_(max<size_t>(N, other.facets_.size()+1)),
409 unique_ptr<facet, release> hold(f);
410 facets_ = other.facets_;
411 for (unsigned i = 0; i < other.facets_.size(); ++i)
413 facets_[i]->__add_shared();
414 install(hold.get(), id);
417 locale::__imp::~__imp()
419 for (unsigned i = 0; i < facets_.size(); ++i)
421 facets_[i]->__release_shared();
425 locale::__imp::install(facet* f, long id)
428 unique_ptr<facet, release> hold(f);
429 if (static_cast<size_t>(id) >= facets_.size())
430 facets_.resize(static_cast<size_t>(id+1));
431 if (facets_[static_cast<size_t>(id)])
432 facets_[static_cast<size_t>(id)]->__release_shared();
433 facets_[static_cast<size_t>(id)] = hold.release();
437 locale::__imp::use_facet(long id) const
439 #ifndef _LIBCPP_NO_EXCEPTIONS
442 #endif // _LIBCPP_NO_EXCEPTIONS
443 return facets_[static_cast<size_t>(id)];
449 locale::__imp::make_classic()
451 // only one thread can get in here and it only gets in once
452 static aligned_storage<sizeof(locale)>::type buf;
453 locale* c = reinterpret_cast<locale*>(&buf);
454 c->__locale_ = &make<__imp>(1u);
461 static const locale& c = __imp::make_classic();
466 locale::__imp::make_global()
468 // only one thread can get in here and it only gets in once
469 static aligned_storage<sizeof(locale)>::type buf;
470 ::new (&buf) locale(locale::classic());
471 return *reinterpret_cast<locale*>(&buf);
477 static locale& g = __imp::make_global();
481 locale::locale() _NOEXCEPT
482 : __locale_(__global().__locale_)
484 __locale_->__add_shared();
487 locale::locale(const locale& l) _NOEXCEPT
488 : __locale_(l.__locale_)
490 __locale_->__add_shared();
495 __locale_->__release_shared();
499 locale::operator=(const locale& other) _NOEXCEPT
501 other.__locale_->__add_shared();
502 __locale_->__release_shared();
503 __locale_ = other.__locale_;
507 locale::locale(const char* name)
508 #ifndef _LIBCPP_NO_EXCEPTIONS
509 : __locale_(name ? new __imp(name)
510 : throw runtime_error("locale constructed with null"))
511 #else // _LIBCPP_NO_EXCEPTIONS
512 : __locale_(new __imp(name))
515 __locale_->__add_shared();
518 locale::locale(const string& name)
519 : __locale_(new __imp(name))
521 __locale_->__add_shared();
524 locale::locale(const locale& other, const char* name, category c)
525 #ifndef _LIBCPP_NO_EXCEPTIONS
526 : __locale_(name ? new __imp(*other.__locale_, name, c)
527 : throw runtime_error("locale constructed with null"))
528 #else // _LIBCPP_NO_EXCEPTIONS
529 : __locale_(new __imp(*other.__locale_, name, c))
532 __locale_->__add_shared();
535 locale::locale(const locale& other, const string& name, category c)
536 : __locale_(new __imp(*other.__locale_, name, c))
538 __locale_->__add_shared();
541 locale::locale(const locale& other, const locale& one, category c)
542 : __locale_(new __imp(*other.__locale_, *one.__locale_, c))
544 __locale_->__add_shared();
550 return __locale_->name();
554 locale::__install_ctor(const locale& other, facet* f, long id)
557 __locale_ = new __imp(*other.__locale_, f, id);
559 __locale_ = other.__locale_;
560 __locale_->__add_shared();
564 locale::global(const locale& loc)
566 locale& g = __global();
571 setlocale(LC_ALL, g.name().c_str());
577 locale::has_facet(id& x) const
579 return __locale_->has_facet(x.__get());
583 locale::use_facet(id& x) const
585 return __locale_->use_facet(x.__get());
589 locale::operator==(const locale& y) const
591 return (__locale_ == y.__locale_)
592 || (__locale_->name() != "*" && __locale_->name() == y.__locale_->name());
597 locale::facet::~facet()
602 locale::facet::__on_zero_shared() _NOEXCEPT
609 int32_t locale::id::__next_id = 0;
617 void (locale::id::* pmf_)();
619 __fake_bind(void (locale::id::* pmf)(), locale::id* id)
620 : id_(id), pmf_(pmf) {}
622 void operator()() const
633 call_once(__flag_, __fake_bind(&locale::id::__init, this));
640 __id_ = __sync_add_and_fetch(&__next_id, 1);
643 // template <> class collate_byname<char>
645 collate_byname<char>::collate_byname(const char* n, size_t refs)
646 : collate<char>(refs),
647 __l(newlocale(LC_ALL_MASK, n, 0))
649 #ifndef _LIBCPP_NO_EXCEPTIONS
651 throw runtime_error("collate_byname<char>::collate_byname"
652 " failed to construct for " + string(n));
653 #endif // _LIBCPP_NO_EXCEPTIONS
656 collate_byname<char>::collate_byname(const string& name, size_t refs)
657 : collate<char>(refs),
658 __l(newlocale(LC_ALL_MASK, name.c_str(), 0))
660 #ifndef _LIBCPP_NO_EXCEPTIONS
662 throw runtime_error("collate_byname<char>::collate_byname"
663 " failed to construct for " + name);
664 #endif // _LIBCPP_NO_EXCEPTIONS
667 collate_byname<char>::~collate_byname()
673 collate_byname<char>::do_compare(const char_type* __lo1, const char_type* __hi1,
674 const char_type* __lo2, const char_type* __hi2) const
676 string_type lhs(__lo1, __hi1);
677 string_type rhs(__lo2, __hi2);
678 int r = strcoll_l(lhs.c_str(), rhs.c_str(), __l);
686 collate_byname<char>::string_type
687 collate_byname<char>::do_transform(const char_type* lo, const char_type* hi) const
689 const string_type in(lo, hi);
690 string_type out(strxfrm_l(0, in.c_str(), 0, __l), char());
691 strxfrm_l(const_cast<char*>(out.c_str()), in.c_str(), out.size()+1, __l);
695 // template <> class collate_byname<wchar_t>
697 collate_byname<wchar_t>::collate_byname(const char* n, size_t refs)
698 : collate<wchar_t>(refs),
699 __l(newlocale(LC_ALL_MASK, n, 0))
701 #ifndef _LIBCPP_NO_EXCEPTIONS
703 throw runtime_error("collate_byname<wchar_t>::collate_byname(size_t refs)"
704 " failed to construct for " + string(n));
705 #endif // _LIBCPP_NO_EXCEPTIONS
708 collate_byname<wchar_t>::collate_byname(const string& name, size_t refs)
709 : collate<wchar_t>(refs),
710 __l(newlocale(LC_ALL_MASK, name.c_str(), 0))
712 #ifndef _LIBCPP_NO_EXCEPTIONS
714 throw runtime_error("collate_byname<wchar_t>::collate_byname(size_t refs)"
715 " failed to construct for " + name);
716 #endif // _LIBCPP_NO_EXCEPTIONS
719 collate_byname<wchar_t>::~collate_byname()
725 collate_byname<wchar_t>::do_compare(const char_type* __lo1, const char_type* __hi1,
726 const char_type* __lo2, const char_type* __hi2) const
728 string_type lhs(__lo1, __hi1);
729 string_type rhs(__lo2, __hi2);
730 int r = wcscoll_l(lhs.c_str(), rhs.c_str(), __l);
738 collate_byname<wchar_t>::string_type
739 collate_byname<wchar_t>::do_transform(const char_type* lo, const char_type* hi) const
741 const string_type in(lo, hi);
742 string_type out(wcsxfrm_l(0, in.c_str(), 0, __l), wchar_t());
743 wcsxfrm_l(const_cast<wchar_t*>(out.c_str()), in.c_str(), out.size()+1, __l);
747 // template <> class ctype<wchar_t>;
749 const ctype_base::mask ctype_base::space;
750 const ctype_base::mask ctype_base::print;
751 const ctype_base::mask ctype_base::cntrl;
752 const ctype_base::mask ctype_base::upper;
753 const ctype_base::mask ctype_base::lower;
754 const ctype_base::mask ctype_base::alpha;
755 const ctype_base::mask ctype_base::digit;
756 const ctype_base::mask ctype_base::punct;
757 const ctype_base::mask ctype_base::xdigit;
758 const ctype_base::mask ctype_base::blank;
759 const ctype_base::mask ctype_base::alnum;
760 const ctype_base::mask ctype_base::graph;
762 locale::id ctype<wchar_t>::id;
764 ctype<wchar_t>::~ctype()
769 ctype<wchar_t>::do_is(mask m, char_type c) const
771 return isascii(c) ? (ctype<char>::classic_table()[c] & m) != 0 : false;
775 ctype<wchar_t>::do_is(const char_type* low, const char_type* high, mask* vec) const
777 for (; low != high; ++low, ++vec)
778 *vec = static_cast<mask>(isascii(*low) ?
779 ctype<char>::classic_table()[*low] : 0);
784 ctype<wchar_t>::do_scan_is(mask m, const char_type* low, const char_type* high) const
786 for (; low != high; ++low)
787 if (isascii(*low) && (ctype<char>::classic_table()[*low] & m))
793 ctype<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high) const
795 for (; low != high; ++low)
796 if (!(isascii(*low) && (ctype<char>::classic_table()[*low] & m)))
802 ctype<wchar_t>::do_toupper(char_type c) const
804 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
805 return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c;
806 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || \
808 return isascii(c) ? ctype<char>::__classic_upper_table()[c] : c;
810 return (isascii(c) && iswlower_l(c, _LIBCPP_GET_C_LOCALE)) ? c-L'a'+L'A' : c;
815 ctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const
817 for (; low != high; ++low)
818 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
819 *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low;
820 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || \
822 *low = isascii(*low) ? ctype<char>::__classic_upper_table()[*low]
825 *low = (isascii(*low) && islower_l(*low, _LIBCPP_GET_C_LOCALE)) ? (*low-L'a'+L'A') : *low;
831 ctype<wchar_t>::do_tolower(char_type c) const
833 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
834 return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c;
835 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || \
837 return isascii(c) ? ctype<char>::__classic_lower_table()[c] : c;
839 return (isascii(c) && isupper_l(c, _LIBCPP_GET_C_LOCALE)) ? c-L'A'+'a' : c;
844 ctype<wchar_t>::do_tolower(char_type* low, const char_type* high) const
846 for (; low != high; ++low)
847 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
848 *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low;
849 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || \
851 *low = isascii(*low) ? ctype<char>::__classic_lower_table()[*low]
854 *low = (isascii(*low) && isupper_l(*low, _LIBCPP_GET_C_LOCALE)) ? *low-L'A'+L'a' : *low;
860 ctype<wchar_t>::do_widen(char c) const
866 ctype<wchar_t>::do_widen(const char* low, const char* high, char_type* dest) const
868 for (; low != high; ++low, ++dest)
874 ctype<wchar_t>::do_narrow(char_type c, char dfault) const
877 return static_cast<char>(c);
882 ctype<wchar_t>::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const
884 for (; low != high; ++low, ++dest)
886 *dest = static_cast<char>(*low);
892 // template <> class ctype<char>;
894 locale::id ctype<char>::id;
896 ctype<char>::ctype(const mask* tab, bool del, size_t refs)
897 : locale::facet(refs),
902 __tab_ = classic_table();
905 ctype<char>::~ctype()
907 if (__tab_ && __del_)
912 ctype<char>::do_toupper(char_type c) const
914 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
916 static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(c)]) : c;
917 #elif defined(__NetBSD__)
918 return static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(c)]);
919 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__)
921 static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(c)]) : c;
923 return (isascii(c) && islower_l(c, _LIBCPP_GET_C_LOCALE)) ? c-'a'+'A' : c;
928 ctype<char>::do_toupper(char_type* low, const char_type* high) const
930 for (; low != high; ++low)
931 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
932 *low = isascii(*low) ?
933 static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(*low)]) : *low;
934 #elif defined(__NetBSD__)
935 *low = static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(*low)]);
936 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__)
937 *low = isascii(*low) ?
938 static_cast<char>(__classic_upper_table()[static_cast<size_t>(*low)]) : *low;
940 *low = (isascii(*low) && islower_l(*low, _LIBCPP_GET_C_LOCALE)) ? *low-'a'+'A' : *low;
946 ctype<char>::do_tolower(char_type c) const
948 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
950 static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(c)]) : c;
951 #elif defined(__NetBSD__)
952 return static_cast<char>(__classic_lower_table()[static_cast<unsigned char>(c)]);
953 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__)
955 static_cast<char>(__classic_lower_table()[static_cast<size_t>(c)]) : c;
957 return (isascii(c) && isupper_l(c, _LIBCPP_GET_C_LOCALE)) ? c-'A'+'a' : c;
962 ctype<char>::do_tolower(char_type* low, const char_type* high) const
964 for (; low != high; ++low)
965 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
966 *low = isascii(*low) ? static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(*low)]) : *low;
967 #elif defined(__NetBSD__)
968 *low = static_cast<char>(__classic_lower_table()[static_cast<unsigned char>(*low)]);
969 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__)
970 *low = isascii(*low) ? static_cast<char>(__classic_lower_table()[static_cast<size_t>(*low)]) : *low;
972 *low = (isascii(*low) && isupper_l(*low, _LIBCPP_GET_C_LOCALE)) ? *low-'A'+'a' : *low;
978 ctype<char>::do_widen(char c) const
984 ctype<char>::do_widen(const char* low, const char* high, char_type* dest) const
986 for (; low != high; ++low, ++dest)
992 ctype<char>::do_narrow(char_type c, char dfault) const
995 return static_cast<char>(c);
1000 ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const
1002 for (; low != high; ++low, ++dest)
1010 #if defined(__EMSCRIPTEN__)
1011 extern "C" const unsigned short ** __ctype_b_loc();
1012 extern "C" const int ** __ctype_tolower_loc();
1013 extern "C" const int ** __ctype_toupper_loc();
1016 #ifdef _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
1017 const ctype<char>::mask*
1018 ctype<char>::classic_table() _NOEXCEPT
1020 static _LIBCPP_CONSTEXPR const ctype<char>::mask builtin_table[table_size] = {
1025 cntrl, cntrl | space | blank,
1026 cntrl | space, cntrl | space,
1027 cntrl | space, cntrl | space,
1037 space | blank | print, punct | print,
1038 punct | print, punct | print,
1039 punct | print, punct | print,
1040 punct | print, punct | print,
1041 punct | print, punct | print,
1042 punct | print, punct | print,
1043 punct | print, punct | print,
1044 punct | print, punct | print,
1045 digit | print | xdigit, digit | print | xdigit,
1046 digit | print | xdigit, digit | print | xdigit,
1047 digit | print | xdigit, digit | print | xdigit,
1048 digit | print | xdigit, digit | print | xdigit,
1049 digit | print | xdigit, digit | print | xdigit,
1050 punct | print, punct | print,
1051 punct | print, punct | print,
1052 punct | print, punct | print,
1053 punct | print, upper | xdigit | print | alpha,
1054 upper | xdigit | print | alpha, upper | xdigit | print | alpha,
1055 upper | xdigit | print | alpha, upper | xdigit | print | alpha,
1056 upper | xdigit | print | alpha, upper | print | alpha,
1057 upper | print | alpha, upper | print | alpha,
1058 upper | print | alpha, upper | print | alpha,
1059 upper | print | alpha, upper | print | alpha,
1060 upper | print | alpha, upper | print | alpha,
1061 upper | print | alpha, upper | print | alpha,
1062 upper | print | alpha, upper | print | alpha,
1063 upper | print | alpha, upper | print | alpha,
1064 upper | print | alpha, upper | print | alpha,
1065 upper | print | alpha, upper | print | alpha,
1066 upper | print | alpha, punct | print,
1067 punct | print, punct | print,
1068 punct | print, punct | print,
1069 punct | print, lower | xdigit | print | alpha,
1070 lower | xdigit | print | alpha, lower | xdigit | print | alpha,
1071 lower | xdigit | print | alpha, lower | xdigit | print | alpha,
1072 lower | xdigit | print | alpha, lower | print | alpha,
1073 lower | print | alpha, lower | print | alpha,
1074 lower | print | alpha, lower | print | alpha,
1075 lower | print | alpha, lower | print | alpha,
1076 lower | print | alpha, lower | print | alpha,
1077 lower | print | alpha, lower | print | alpha,
1078 lower | print | alpha, lower | print | alpha,
1079 lower | print | alpha, lower | print | alpha,
1080 lower | print | alpha, lower | print | alpha,
1081 lower | print | alpha, lower | print | alpha,
1082 lower | print | alpha, punct | print,
1083 punct | print, punct | print,
1084 punct | print, cntrl,
1085 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1086 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1087 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1088 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1089 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1090 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1091 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1092 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1094 return builtin_table;
1097 const ctype<char>::mask*
1098 ctype<char>::classic_table() _NOEXCEPT
1100 #if defined(__APPLE__) || defined(__FreeBSD__)
1101 return _DefaultRuneLocale.__runetype;
1102 #elif defined(__NetBSD__)
1103 return _C_ctype_tab_ + 1;
1104 #elif defined(__GLIBC__)
1105 return _LIBCPP_GET_C_LOCALE->__ctype_b;
1107 return __ctype_mask;
1108 #elif defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
1109 return _ctype+1; // internal ctype mask table defined in msvcrt.dll
1110 // This is assumed to be safe, which is a nonsense assumption because we're
1111 // going to end up dereferencing it later...
1112 #elif defined(__EMSCRIPTEN__)
1113 return *__ctype_b_loc();
1114 #elif defined(_NEWLIB_VERSION)
1115 // Newlib has a 257-entry table in ctype_.c, where (char)0 starts at [1].
1118 return (const unsigned int *)__lc_ctype_ptr->obj->mask;
1120 // Platform not supported: abort so the person doing the port knows what to
1122 # warning ctype<char>::classic_table() is not implemented
1123 printf("ctype<char>::classic_table() is not implemented\n");
1130 #if defined(__GLIBC__)
1132 ctype<char>::__classic_lower_table() _NOEXCEPT
1134 return _LIBCPP_GET_C_LOCALE->__ctype_tolower;
1138 ctype<char>::__classic_upper_table() _NOEXCEPT
1140 return _LIBCPP_GET_C_LOCALE->__ctype_toupper;
1144 ctype<char>::__classic_lower_table() _NOEXCEPT
1146 return _C_tolower_tab_ + 1;
1150 ctype<char>::__classic_upper_table() _NOEXCEPT
1152 return _C_toupper_tab_ + 1;
1155 #elif defined(__EMSCRIPTEN__)
1157 ctype<char>::__classic_lower_table() _NOEXCEPT
1159 return *__ctype_tolower_loc();
1163 ctype<char>::__classic_upper_table() _NOEXCEPT
1165 return *__ctype_toupper_loc();
1167 #endif // __GLIBC__ || __NETBSD__ || __EMSCRIPTEN__
1169 // template <> class ctype_byname<char>
1171 ctype_byname<char>::ctype_byname(const char* name, size_t refs)
1172 : ctype<char>(0, false, refs),
1173 __l(newlocale(LC_ALL_MASK, name, 0))
1175 #ifndef _LIBCPP_NO_EXCEPTIONS
1177 throw runtime_error("ctype_byname<char>::ctype_byname"
1178 " failed to construct for " + string(name));
1179 #endif // _LIBCPP_NO_EXCEPTIONS
1182 ctype_byname<char>::ctype_byname(const string& name, size_t refs)
1183 : ctype<char>(0, false, refs),
1184 __l(newlocale(LC_ALL_MASK, name.c_str(), 0))
1186 #ifndef _LIBCPP_NO_EXCEPTIONS
1188 throw runtime_error("ctype_byname<char>::ctype_byname"
1189 " failed to construct for " + name);
1190 #endif // _LIBCPP_NO_EXCEPTIONS
1193 ctype_byname<char>::~ctype_byname()
1199 ctype_byname<char>::do_toupper(char_type c) const
1201 return static_cast<char>(toupper_l(static_cast<unsigned char>(c), __l));
1205 ctype_byname<char>::do_toupper(char_type* low, const char_type* high) const
1207 for (; low != high; ++low)
1208 *low = static_cast<char>(toupper_l(static_cast<unsigned char>(*low), __l));
1213 ctype_byname<char>::do_tolower(char_type c) const
1215 return static_cast<char>(tolower_l(static_cast<unsigned char>(c), __l));
1219 ctype_byname<char>::do_tolower(char_type* low, const char_type* high) const
1221 for (; low != high; ++low)
1222 *low = static_cast<char>(tolower_l(static_cast<unsigned char>(*low), __l));
1226 // template <> class ctype_byname<wchar_t>
1228 ctype_byname<wchar_t>::ctype_byname(const char* name, size_t refs)
1229 : ctype<wchar_t>(refs),
1230 __l(newlocale(LC_ALL_MASK, name, 0))
1232 #ifndef _LIBCPP_NO_EXCEPTIONS
1234 throw runtime_error("ctype_byname<wchar_t>::ctype_byname"
1235 " failed to construct for " + string(name));
1236 #endif // _LIBCPP_NO_EXCEPTIONS
1239 ctype_byname<wchar_t>::ctype_byname(const string& name, size_t refs)
1240 : ctype<wchar_t>(refs),
1241 __l(newlocale(LC_ALL_MASK, name.c_str(), 0))
1243 #ifndef _LIBCPP_NO_EXCEPTIONS
1245 throw runtime_error("ctype_byname<wchar_t>::ctype_byname"
1246 " failed to construct for " + name);
1247 #endif // _LIBCPP_NO_EXCEPTIONS
1250 ctype_byname<wchar_t>::~ctype_byname()
1256 ctype_byname<wchar_t>::do_is(mask m, char_type c) const
1258 #ifdef _LIBCPP_WCTYPE_IS_MASK
1259 return static_cast<bool>(iswctype_l(c, m, __l));
1261 bool result = false;
1262 wint_t ch = static_cast<wint_t>(c);
1263 if ((m & space) == space) result |= (iswspace_l(ch, __l) != 0);
1264 if ((m & print) == print) result |= (iswprint_l(ch, __l) != 0);
1265 if ((m & cntrl) == cntrl) result |= (iswcntrl_l(ch, __l) != 0);
1266 if ((m & upper) == upper) result |= (iswupper_l(ch, __l) != 0);
1267 if ((m & lower) == lower) result |= (iswlower_l(ch, __l) != 0);
1268 if ((m & alpha) == alpha) result |= (iswalpha_l(ch, __l) != 0);
1269 if ((m & digit) == digit) result |= (iswdigit_l(ch, __l) != 0);
1270 if ((m & punct) == punct) result |= (iswpunct_l(ch, __l) != 0);
1271 if ((m & xdigit) == xdigit) result |= (iswxdigit_l(ch, __l) != 0);
1272 if ((m & blank) == blank) result |= (iswblank_l(ch, __l) != 0);
1278 ctype_byname<wchar_t>::do_is(const char_type* low, const char_type* high, mask* vec) const
1280 for (; low != high; ++low, ++vec)
1283 *vec = static_cast<mask>(ctype<char>::classic_table()[*low]);
1287 wint_t ch = static_cast<wint_t>(*low);
1288 if (iswspace_l(ch, __l))
1290 #ifndef _LIBCPP_CTYPE_MASK_IS_COMPOSITE_PRINT
1291 if (iswprint_l(ch, __l))
1294 if (iswcntrl_l(ch, __l))
1296 if (iswupper_l(ch, __l))
1298 if (iswlower_l(ch, __l))
1300 #ifndef _LIBCPP_CTYPE_MASK_IS_COMPOSITE_ALPHA
1301 if (iswalpha_l(ch, __l))
1304 if (iswdigit_l(ch, __l))
1306 if (iswpunct_l(ch, __l))
1308 #ifndef _LIBCPP_CTYPE_MASK_IS_COMPOSITE_XDIGIT
1309 if (iswxdigit_l(ch, __l))
1312 #if !defined(__sun__)
1313 if (iswblank_l(ch, __l))
1322 ctype_byname<wchar_t>::do_scan_is(mask m, const char_type* low, const char_type* high) const
1324 for (; low != high; ++low)
1326 #ifdef _LIBCPP_WCTYPE_IS_MASK
1327 if (iswctype_l(*low, m, __l))
1330 wint_t ch = static_cast<wint_t>(*low);
1331 if ((m & space) == space && iswspace_l(ch, __l)) break;
1332 if ((m & print) == print && iswprint_l(ch, __l)) break;
1333 if ((m & cntrl) == cntrl && iswcntrl_l(ch, __l)) break;
1334 if ((m & upper) == upper && iswupper_l(ch, __l)) break;
1335 if ((m & lower) == lower && iswlower_l(ch, __l)) break;
1336 if ((m & alpha) == alpha && iswalpha_l(ch, __l)) break;
1337 if ((m & digit) == digit && iswdigit_l(ch, __l)) break;
1338 if ((m & punct) == punct && iswpunct_l(ch, __l)) break;
1339 if ((m & xdigit) == xdigit && iswxdigit_l(ch, __l)) break;
1340 if ((m & blank) == blank && iswblank_l(ch, __l)) break;
1347 ctype_byname<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high) const
1349 for (; low != high; ++low)
1351 #ifdef _LIBCPP_WCTYPE_IS_MASK
1352 if (!iswctype_l(*low, m, __l))
1355 wint_t ch = static_cast<wint_t>(*low);
1356 if ((m & space) == space && iswspace_l(ch, __l)) continue;
1357 if ((m & print) == print && iswprint_l(ch, __l)) continue;
1358 if ((m & cntrl) == cntrl && iswcntrl_l(ch, __l)) continue;
1359 if ((m & upper) == upper && iswupper_l(ch, __l)) continue;
1360 if ((m & lower) == lower && iswlower_l(ch, __l)) continue;
1361 if ((m & alpha) == alpha && iswalpha_l(ch, __l)) continue;
1362 if ((m & digit) == digit && iswdigit_l(ch, __l)) continue;
1363 if ((m & punct) == punct && iswpunct_l(ch, __l)) continue;
1364 if ((m & xdigit) == xdigit && iswxdigit_l(ch, __l)) continue;
1365 if ((m & blank) == blank && iswblank_l(ch, __l)) continue;
1373 ctype_byname<wchar_t>::do_toupper(char_type c) const
1375 return towupper_l(c, __l);
1379 ctype_byname<wchar_t>::do_toupper(char_type* low, const char_type* high) const
1381 for (; low != high; ++low)
1382 *low = towupper_l(*low, __l);
1387 ctype_byname<wchar_t>::do_tolower(char_type c) const
1389 return towlower_l(c, __l);
1393 ctype_byname<wchar_t>::do_tolower(char_type* low, const char_type* high) const
1395 for (; low != high; ++low)
1396 *low = towlower_l(*low, __l);
1401 ctype_byname<wchar_t>::do_widen(char c) const
1403 return __libcpp_btowc_l(c, __l);
1407 ctype_byname<wchar_t>::do_widen(const char* low, const char* high, char_type* dest) const
1409 for (; low != high; ++low, ++dest)
1410 *dest = __libcpp_btowc_l(*low, __l);
1415 ctype_byname<wchar_t>::do_narrow(char_type c, char dfault) const
1417 int r = __libcpp_wctob_l(c, __l);
1418 return r != static_cast<int>(WEOF) ? static_cast<char>(r) : dfault;
1422 ctype_byname<wchar_t>::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const
1424 for (; low != high; ++low, ++dest)
1426 int r = __libcpp_wctob_l(*low, __l);
1427 *dest = r != static_cast<int>(WEOF) ? static_cast<char>(r) : dfault;
1432 // template <> class codecvt<char, char, mbstate_t>
1434 locale::id codecvt<char, char, mbstate_t>::id;
1436 codecvt<char, char, mbstate_t>::~codecvt()
1440 codecvt<char, char, mbstate_t>::result
1441 codecvt<char, char, mbstate_t>::do_out(state_type&,
1442 const intern_type* frm, const intern_type*, const intern_type*& frm_nxt,
1443 extern_type* to, extern_type*, extern_type*& to_nxt) const
1450 codecvt<char, char, mbstate_t>::result
1451 codecvt<char, char, mbstate_t>::do_in(state_type&,
1452 const extern_type* frm, const extern_type*, const extern_type*& frm_nxt,
1453 intern_type* to, intern_type*, intern_type*& to_nxt) const
1460 codecvt<char, char, mbstate_t>::result
1461 codecvt<char, char, mbstate_t>::do_unshift(state_type&,
1462 extern_type* to, extern_type*, extern_type*& to_nxt) const
1469 codecvt<char, char, mbstate_t>::do_encoding() const _NOEXCEPT
1475 codecvt<char, char, mbstate_t>::do_always_noconv() const _NOEXCEPT
1481 codecvt<char, char, mbstate_t>::do_length(state_type&,
1482 const extern_type* frm, const extern_type* end, size_t mx) const
1484 return static_cast<int>(min<size_t>(mx, static_cast<size_t>(end-frm)));
1488 codecvt<char, char, mbstate_t>::do_max_length() const _NOEXCEPT
1493 // template <> class codecvt<wchar_t, char, mbstate_t>
1495 locale::id codecvt<wchar_t, char, mbstate_t>::id;
1497 codecvt<wchar_t, char, mbstate_t>::codecvt(size_t refs)
1498 : locale::facet(refs),
1499 __l(_LIBCPP_GET_C_LOCALE)
1503 codecvt<wchar_t, char, mbstate_t>::codecvt(const char* nm, size_t refs)
1504 : locale::facet(refs),
1505 __l(newlocale(LC_ALL_MASK, nm, 0))
1507 #ifndef _LIBCPP_NO_EXCEPTIONS
1509 throw runtime_error("codecvt_byname<wchar_t, char, mbstate_t>::codecvt_byname"
1510 " failed to construct for " + string(nm));
1511 #endif // _LIBCPP_NO_EXCEPTIONS
1514 codecvt<wchar_t, char, mbstate_t>::~codecvt()
1516 if (__l != _LIBCPP_GET_C_LOCALE)
1520 codecvt<wchar_t, char, mbstate_t>::result
1521 codecvt<wchar_t, char, mbstate_t>::do_out(state_type& st,
1522 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
1523 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
1525 // look for first internal null in frm
1526 const intern_type* fend = frm;
1527 for (; fend != frm_end; ++fend)
1530 // loop over all null-terminated sequences in frm
1532 for (frm_nxt = frm; frm != frm_end && to != to_end; frm = frm_nxt, to = to_nxt)
1534 // save state in case it is needed to recover to_nxt on error
1535 mbstate_t save_state = st;
1536 size_t n = __libcpp_wcsnrtombs_l(to, &frm_nxt, static_cast<size_t>(fend-frm),
1537 static_cast<size_t>(to_end-to), &st, __l);
1538 if (n == size_t(-1))
1540 // need to recover to_nxt
1541 for (to_nxt = to; frm != frm_nxt; ++frm)
1543 n = __libcpp_wcrtomb_l(to_nxt, *frm, &save_state, __l);
1544 if (n == size_t(-1))
1554 if (to_nxt == to_end)
1556 if (fend != frm_end) // set up next null terminated sequence
1558 // Try to write the terminating null
1559 extern_type tmp[MB_LEN_MAX];
1560 n = __libcpp_wcrtomb_l(tmp, intern_type(), &st, __l);
1561 if (n == size_t(-1)) // on error
1563 if (n > static_cast<size_t>(to_end-to_nxt)) // is there room?
1565 for (extern_type* p = tmp; n; --n) // write it
1568 // look for next null in frm
1569 for (fend = frm_nxt; fend != frm_end; ++fend)
1574 return frm_nxt == frm_end ? ok : partial;
1577 codecvt<wchar_t, char, mbstate_t>::result
1578 codecvt<wchar_t, char, mbstate_t>::do_in(state_type& st,
1579 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
1580 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
1582 // look for first internal null in frm
1583 const extern_type* fend = frm;
1584 for (; fend != frm_end; ++fend)
1587 // loop over all null-terminated sequences in frm
1589 for (frm_nxt = frm; frm != frm_end && to != to_end; frm = frm_nxt, to = to_nxt)
1591 // save state in case it is needed to recover to_nxt on error
1592 mbstate_t save_state = st;
1593 size_t n = __libcpp_mbsnrtowcs_l(to, &frm_nxt, static_cast<size_t>(fend-frm),
1594 static_cast<size_t>(to_end-to), &st, __l);
1595 if (n == size_t(-1))
1597 // need to recover to_nxt
1598 for (to_nxt = to; frm != frm_nxt; ++to_nxt)
1600 n = __libcpp_mbrtowc_l(to_nxt, frm, static_cast<size_t>(fend-frm),
1619 return frm_nxt == frm_end ? ok : partial;
1621 if (n == size_t(-1))
1624 if (to_nxt == to_end)
1626 if (fend != frm_end) // set up next null terminated sequence
1628 // Try to write the terminating null
1629 n = __libcpp_mbrtowc_l(to_nxt, frm_nxt, 1, &st, __l);
1630 if (n != 0) // on error
1634 // look for next null in frm
1635 for (fend = frm_nxt; fend != frm_end; ++fend)
1640 return frm_nxt == frm_end ? ok : partial;
1643 codecvt<wchar_t, char, mbstate_t>::result
1644 codecvt<wchar_t, char, mbstate_t>::do_unshift(state_type& st,
1645 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
1648 extern_type tmp[MB_LEN_MAX];
1649 size_t n = __libcpp_wcrtomb_l(tmp, intern_type(), &st, __l);
1650 if (n == size_t(-1) || n == 0) // on error
1653 if (n > static_cast<size_t>(to_end-to_nxt)) // is there room?
1655 for (extern_type* p = tmp; n; --n) // write it
1661 codecvt<wchar_t, char, mbstate_t>::do_encoding() const _NOEXCEPT
1663 if (__libcpp_mbtowc_l(nullptr, nullptr, MB_LEN_MAX, __l) != 0)
1666 // stateless encoding
1667 if (__l == 0 || __libcpp_mb_cur_max_l(__l) == 1) // there are no known constant length encodings
1668 return 1; // which take more than 1 char to form a wchar_t
1673 codecvt<wchar_t, char, mbstate_t>::do_always_noconv() const _NOEXCEPT
1679 codecvt<wchar_t, char, mbstate_t>::do_length(state_type& st,
1680 const extern_type* frm, const extern_type* frm_end, size_t mx) const
1683 for (size_t nwchar_t = 0; nwchar_t < mx && frm != frm_end; ++nwchar_t)
1685 size_t n = __libcpp_mbrlen_l(frm, static_cast<size_t>(frm_end-frm), &st, __l);
1705 codecvt<wchar_t, char, mbstate_t>::do_max_length() const _NOEXCEPT
1707 return __l == 0 ? 1 : static_cast<int>(__libcpp_mb_cur_max_l(__l));
1711 // UTF-32 UTF-16 UTF-8 # of code points
1712 // first second first second third fourth
1713 // 000000 - 00007F 0000 - 007F 00 - 7F 127
1714 // 000080 - 0007FF 0080 - 07FF C2 - DF, 80 - BF 1920
1715 // 000800 - 000FFF 0800 - 0FFF E0 - E0, A0 - BF, 80 - BF 2048
1716 // 001000 - 00CFFF 1000 - CFFF E1 - EC, 80 - BF, 80 - BF 49152
1717 // 00D000 - 00D7FF D000 - D7FF ED - ED, 80 - 9F, 80 - BF 2048
1718 // 00D800 - 00DFFF invalid
1719 // 00E000 - 00FFFF E000 - FFFF EE - EF, 80 - BF, 80 - BF 8192
1720 // 010000 - 03FFFF D800 - D8BF, DC00 - DFFF F0 - F0, 90 - BF, 80 - BF, 80 - BF 196608
1721 // 040000 - 0FFFFF D8C0 - DBBF, DC00 - DFFF F1 - F3, 80 - BF, 80 - BF, 80 - BF 786432
1722 // 100000 - 10FFFF DBC0 - DBFF, DC00 - DFFF F4 - F4, 80 - 8F, 80 - BF, 80 - BF 65536
1725 codecvt_base::result
1726 utf16_to_utf8(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt,
1727 uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
1728 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
1732 if (mode & generate_header)
1734 if (to_end-to_nxt < 3)
1735 return codecvt_base::partial;
1736 *to_nxt++ = static_cast<uint8_t>(0xEF);
1737 *to_nxt++ = static_cast<uint8_t>(0xBB);
1738 *to_nxt++ = static_cast<uint8_t>(0xBF);
1740 for (; frm_nxt < frm_end; ++frm_nxt)
1742 uint16_t wc1 = *frm_nxt;
1744 return codecvt_base::error;
1747 if (to_end-to_nxt < 1)
1748 return codecvt_base::partial;
1749 *to_nxt++ = static_cast<uint8_t>(wc1);
1751 else if (wc1 < 0x0800)
1753 if (to_end-to_nxt < 2)
1754 return codecvt_base::partial;
1755 *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc1 >> 6));
1756 *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x03F));
1758 else if (wc1 < 0xD800)
1760 if (to_end-to_nxt < 3)
1761 return codecvt_base::partial;
1762 *to_nxt++ = static_cast<uint8_t>(0xE0 | (wc1 >> 12));
1763 *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6));
1764 *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x003F));
1766 else if (wc1 < 0xDC00)
1768 if (frm_end-frm_nxt < 2)
1769 return codecvt_base::partial;
1770 uint16_t wc2 = frm_nxt[1];
1771 if ((wc2 & 0xFC00) != 0xDC00)
1772 return codecvt_base::error;
1773 if (to_end-to_nxt < 4)
1774 return codecvt_base::partial;
1775 if (((((wc1 & 0x03C0UL) >> 6) + 1) << 16) +
1776 ((wc1 & 0x003FUL) << 10) + (wc2 & 0x03FF) > Maxcode)
1777 return codecvt_base::error;
1779 uint8_t z = ((wc1 & 0x03C0) >> 6) + 1;
1780 *to_nxt++ = static_cast<uint8_t>(0xF0 | (z >> 2));
1781 *to_nxt++ = static_cast<uint8_t>(0x80 | ((z & 0x03) << 4) | ((wc1 & 0x003C) >> 2));
1782 *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0003) << 4) | ((wc2 & 0x03C0) >> 6));
1783 *to_nxt++ = static_cast<uint8_t>(0x80 | (wc2 & 0x003F));
1785 else if (wc1 < 0xE000)
1787 return codecvt_base::error;
1791 if (to_end-to_nxt < 3)
1792 return codecvt_base::partial;
1793 *to_nxt++ = static_cast<uint8_t>(0xE0 | (wc1 >> 12));
1794 *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6));
1795 *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x003F));
1798 return codecvt_base::ok;
1802 codecvt_base::result
1803 utf16_to_utf8(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt,
1804 uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
1805 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
1809 if (mode & generate_header)
1811 if (to_end-to_nxt < 3)
1812 return codecvt_base::partial;
1813 *to_nxt++ = static_cast<uint8_t>(0xEF);
1814 *to_nxt++ = static_cast<uint8_t>(0xBB);
1815 *to_nxt++ = static_cast<uint8_t>(0xBF);
1817 for (; frm_nxt < frm_end; ++frm_nxt)
1819 uint16_t wc1 = static_cast<uint16_t>(*frm_nxt);
1821 return codecvt_base::error;
1824 if (to_end-to_nxt < 1)
1825 return codecvt_base::partial;
1826 *to_nxt++ = static_cast<uint8_t>(wc1);
1828 else if (wc1 < 0x0800)
1830 if (to_end-to_nxt < 2)
1831 return codecvt_base::partial;
1832 *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc1 >> 6));
1833 *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x03F));
1835 else if (wc1 < 0xD800)
1837 if (to_end-to_nxt < 3)
1838 return codecvt_base::partial;
1839 *to_nxt++ = static_cast<uint8_t>(0xE0 | (wc1 >> 12));
1840 *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6));
1841 *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x003F));
1843 else if (wc1 < 0xDC00)
1845 if (frm_end-frm_nxt < 2)
1846 return codecvt_base::partial;
1847 uint16_t wc2 = static_cast<uint16_t>(frm_nxt[1]);
1848 if ((wc2 & 0xFC00) != 0xDC00)
1849 return codecvt_base::error;
1850 if (to_end-to_nxt < 4)
1851 return codecvt_base::partial;
1852 if (((((wc1 & 0x03C0UL) >> 6) + 1) << 16) +
1853 ((wc1 & 0x003FUL) << 10) + (wc2 & 0x03FF) > Maxcode)
1854 return codecvt_base::error;
1856 uint8_t z = ((wc1 & 0x03C0) >> 6) + 1;
1857 *to_nxt++ = static_cast<uint8_t>(0xF0 | (z >> 2));
1858 *to_nxt++ = static_cast<uint8_t>(0x80 | ((z & 0x03) << 4) | ((wc1 & 0x003C) >> 2));
1859 *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0003) << 4) | ((wc2 & 0x03C0) >> 6));
1860 *to_nxt++ = static_cast<uint8_t>(0x80 | (wc2 & 0x003F));
1862 else if (wc1 < 0xE000)
1864 return codecvt_base::error;
1868 if (to_end-to_nxt < 3)
1869 return codecvt_base::partial;
1870 *to_nxt++ = static_cast<uint8_t>(0xE0 | (wc1 >> 12));
1871 *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6));
1872 *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x003F));
1875 return codecvt_base::ok;
1879 codecvt_base::result
1880 utf8_to_utf16(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
1881 uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt,
1882 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
1886 if (mode & consume_header)
1888 if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
1892 for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt)
1894 uint8_t c1 = *frm_nxt;
1896 return codecvt_base::error;
1899 *to_nxt = static_cast<uint16_t>(c1);
1904 return codecvt_base::error;
1908 if (frm_end-frm_nxt < 2)
1909 return codecvt_base::partial;
1910 uint8_t c2 = frm_nxt[1];
1911 if ((c2 & 0xC0) != 0x80)
1912 return codecvt_base::error;
1913 uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6) | (c2 & 0x3F));
1915 return codecvt_base::error;
1921 if (frm_end-frm_nxt < 3)
1922 return codecvt_base::partial;
1923 uint8_t c2 = frm_nxt[1];
1924 uint8_t c3 = frm_nxt[2];
1928 if ((c2 & 0xE0) != 0xA0)
1929 return codecvt_base::error;
1932 if ((c2 & 0xE0) != 0x80)
1933 return codecvt_base::error;
1936 if ((c2 & 0xC0) != 0x80)
1937 return codecvt_base::error;
1940 if ((c3 & 0xC0) != 0x80)
1941 return codecvt_base::error;
1942 uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12)
1943 | ((c2 & 0x3F) << 6)
1946 return codecvt_base::error;
1952 if (frm_end-frm_nxt < 4)
1953 return codecvt_base::partial;
1954 uint8_t c2 = frm_nxt[1];
1955 uint8_t c3 = frm_nxt[2];
1956 uint8_t c4 = frm_nxt[3];
1960 if (!(0x90 <= c2 && c2 <= 0xBF))
1961 return codecvt_base::error;
1964 if ((c2 & 0xF0) != 0x80)
1965 return codecvt_base::error;
1968 if ((c2 & 0xC0) != 0x80)
1969 return codecvt_base::error;
1972 if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
1973 return codecvt_base::error;
1974 if (to_end-to_nxt < 2)
1975 return codecvt_base::partial;
1976 if ((((c1 & 7UL) << 18) +
1977 ((c2 & 0x3FUL) << 12) +
1978 ((c3 & 0x3FUL) << 6) + (c4 & 0x3F)) > Maxcode)
1979 return codecvt_base::error;
1980 *to_nxt = static_cast<uint16_t>(
1982 | (((((c1 & 0x07) << 2) | ((c2 & 0x30) >> 4)) - 1) << 6)
1983 | ((c2 & 0x0F) << 2)
1984 | ((c3 & 0x30) >> 4));
1985 *++to_nxt = static_cast<uint16_t>(
1987 | ((c3 & 0x0F) << 6)
1993 return codecvt_base::error;
1996 return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2000 codecvt_base::result
2001 utf8_to_utf16(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
2002 uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt,
2003 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2007 if (mode & consume_header)
2009 if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
2013 for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt)
2015 uint8_t c1 = *frm_nxt;
2017 return codecvt_base::error;
2020 *to_nxt = static_cast<uint32_t>(c1);
2025 return codecvt_base::error;
2029 if (frm_end-frm_nxt < 2)
2030 return codecvt_base::partial;
2031 uint8_t c2 = frm_nxt[1];
2032 if ((c2 & 0xC0) != 0x80)
2033 return codecvt_base::error;
2034 uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6) | (c2 & 0x3F));
2036 return codecvt_base::error;
2037 *to_nxt = static_cast<uint32_t>(t);
2042 if (frm_end-frm_nxt < 3)
2043 return codecvt_base::partial;
2044 uint8_t c2 = frm_nxt[1];
2045 uint8_t c3 = frm_nxt[2];
2049 if ((c2 & 0xE0) != 0xA0)
2050 return codecvt_base::error;
2053 if ((c2 & 0xE0) != 0x80)
2054 return codecvt_base::error;
2057 if ((c2 & 0xC0) != 0x80)
2058 return codecvt_base::error;
2061 if ((c3 & 0xC0) != 0x80)
2062 return codecvt_base::error;
2063 uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12)
2064 | ((c2 & 0x3F) << 6)
2067 return codecvt_base::error;
2068 *to_nxt = static_cast<uint32_t>(t);
2073 if (frm_end-frm_nxt < 4)
2074 return codecvt_base::partial;
2075 uint8_t c2 = frm_nxt[1];
2076 uint8_t c3 = frm_nxt[2];
2077 uint8_t c4 = frm_nxt[3];
2081 if (!(0x90 <= c2 && c2 <= 0xBF))
2082 return codecvt_base::error;
2085 if ((c2 & 0xF0) != 0x80)
2086 return codecvt_base::error;
2089 if ((c2 & 0xC0) != 0x80)
2090 return codecvt_base::error;
2093 if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
2094 return codecvt_base::error;
2095 if (to_end-to_nxt < 2)
2096 return codecvt_base::partial;
2097 if ((((c1 & 7UL) << 18) +
2098 ((c2 & 0x3FUL) << 12) +
2099 ((c3 & 0x3FUL) << 6) + (c4 & 0x3F)) > Maxcode)
2100 return codecvt_base::error;
2101 *to_nxt = static_cast<uint32_t>(
2103 | (((((c1 & 0x07) << 2) | ((c2 & 0x30) >> 4)) - 1) << 6)
2104 | ((c2 & 0x0F) << 2)
2105 | ((c3 & 0x30) >> 4));
2106 *++to_nxt = static_cast<uint32_t>(
2108 | ((c3 & 0x0F) << 6)
2114 return codecvt_base::error;
2117 return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2122 utf8_to_utf16_length(const uint8_t* frm, const uint8_t* frm_end,
2123 size_t mx, unsigned long Maxcode = 0x10FFFF,
2124 codecvt_mode mode = codecvt_mode(0))
2126 const uint8_t* frm_nxt = frm;
2127 if (mode & consume_header)
2129 if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
2133 for (size_t nchar16_t = 0; frm_nxt < frm_end && nchar16_t < mx; ++nchar16_t)
2135 uint8_t c1 = *frm_nxt;
2148 if ((frm_end-frm_nxt < 2) || (frm_nxt[1] & 0xC0) != 0x80)
2150 uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6) | (frm_nxt[1] & 0x3F));
2157 if (frm_end-frm_nxt < 3)
2159 uint8_t c2 = frm_nxt[1];
2160 uint8_t c3 = frm_nxt[2];
2164 if ((c2 & 0xE0) != 0xA0)
2165 return static_cast<int>(frm_nxt - frm);
2168 if ((c2 & 0xE0) != 0x80)
2169 return static_cast<int>(frm_nxt - frm);
2172 if ((c2 & 0xC0) != 0x80)
2173 return static_cast<int>(frm_nxt - frm);
2176 if ((c3 & 0xC0) != 0x80)
2178 if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode)
2184 if (frm_end-frm_nxt < 4 || mx-nchar16_t < 2)
2186 uint8_t c2 = frm_nxt[1];
2187 uint8_t c3 = frm_nxt[2];
2188 uint8_t c4 = frm_nxt[3];
2192 if (!(0x90 <= c2 && c2 <= 0xBF))
2193 return static_cast<int>(frm_nxt - frm);
2196 if ((c2 & 0xF0) != 0x80)
2197 return static_cast<int>(frm_nxt - frm);
2200 if ((c2 & 0xC0) != 0x80)
2201 return static_cast<int>(frm_nxt - frm);
2204 if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
2206 if ((((c1 & 7UL) << 18) +
2207 ((c2 & 0x3FUL) << 12) +
2208 ((c3 & 0x3FUL) << 6) + (c4 & 0x3F)) > Maxcode)
2218 return static_cast<int>(frm_nxt - frm);
2222 codecvt_base::result
2223 ucs4_to_utf8(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt,
2224 uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
2225 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2229 if (mode & generate_header)
2231 if (to_end-to_nxt < 3)
2232 return codecvt_base::partial;
2233 *to_nxt++ = static_cast<uint8_t>(0xEF);
2234 *to_nxt++ = static_cast<uint8_t>(0xBB);
2235 *to_nxt++ = static_cast<uint8_t>(0xBF);
2237 for (; frm_nxt < frm_end; ++frm_nxt)
2239 uint32_t wc = *frm_nxt;
2240 if ((wc & 0xFFFFF800) == 0x00D800 || wc > Maxcode)
2241 return codecvt_base::error;
2244 if (to_end-to_nxt < 1)
2245 return codecvt_base::partial;
2246 *to_nxt++ = static_cast<uint8_t>(wc);
2248 else if (wc < 0x000800)
2250 if (to_end-to_nxt < 2)
2251 return codecvt_base::partial;
2252 *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc >> 6));
2253 *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x03F));
2255 else if (wc < 0x010000)
2257 if (to_end-to_nxt < 3)
2258 return codecvt_base::partial;
2259 *to_nxt++ = static_cast<uint8_t>(0xE0 | (wc >> 12));
2260 *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x0FC0) >> 6));
2261 *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x003F));
2263 else // if (wc < 0x110000)
2265 if (to_end-to_nxt < 4)
2266 return codecvt_base::partial;
2267 *to_nxt++ = static_cast<uint8_t>(0xF0 | (wc >> 18));
2268 *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x03F000) >> 12));
2269 *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x000FC0) >> 6));
2270 *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x00003F));
2273 return codecvt_base::ok;
2277 codecvt_base::result
2278 utf8_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
2279 uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt,
2280 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2284 if (mode & consume_header)
2286 if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
2290 for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt)
2292 uint8_t c1 = static_cast<uint8_t>(*frm_nxt);
2296 return codecvt_base::error;
2297 *to_nxt = static_cast<uint32_t>(c1);
2302 return codecvt_base::error;
2306 if (frm_end-frm_nxt < 2)
2307 return codecvt_base::partial;
2308 uint8_t c2 = frm_nxt[1];
2309 if ((c2 & 0xC0) != 0x80)
2310 return codecvt_base::error;
2311 uint32_t t = static_cast<uint32_t>(((c1 & 0x1F) << 6)
2314 return codecvt_base::error;
2320 if (frm_end-frm_nxt < 3)
2321 return codecvt_base::partial;
2322 uint8_t c2 = frm_nxt[1];
2323 uint8_t c3 = frm_nxt[2];
2327 if ((c2 & 0xE0) != 0xA0)
2328 return codecvt_base::error;
2331 if ((c2 & 0xE0) != 0x80)
2332 return codecvt_base::error;
2335 if ((c2 & 0xC0) != 0x80)
2336 return codecvt_base::error;
2339 if ((c3 & 0xC0) != 0x80)
2340 return codecvt_base::error;
2341 uint32_t t = static_cast<uint32_t>(((c1 & 0x0F) << 12)
2342 | ((c2 & 0x3F) << 6)
2345 return codecvt_base::error;
2351 if (frm_end-frm_nxt < 4)
2352 return codecvt_base::partial;
2353 uint8_t c2 = frm_nxt[1];
2354 uint8_t c3 = frm_nxt[2];
2355 uint8_t c4 = frm_nxt[3];
2359 if (!(0x90 <= c2 && c2 <= 0xBF))
2360 return codecvt_base::error;
2363 if ((c2 & 0xF0) != 0x80)
2364 return codecvt_base::error;
2367 if ((c2 & 0xC0) != 0x80)
2368 return codecvt_base::error;
2371 if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
2372 return codecvt_base::error;
2373 uint32_t t = static_cast<uint32_t>(((c1 & 0x07) << 18)
2374 | ((c2 & 0x3F) << 12)
2375 | ((c3 & 0x3F) << 6)
2378 return codecvt_base::error;
2384 return codecvt_base::error;
2387 return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2392 utf8_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end,
2393 size_t mx, unsigned long Maxcode = 0x10FFFF,
2394 codecvt_mode mode = codecvt_mode(0))
2396 const uint8_t* frm_nxt = frm;
2397 if (mode & consume_header)
2399 if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
2403 for (size_t nchar32_t = 0; frm_nxt < frm_end && nchar32_t < mx; ++nchar32_t)
2405 uint8_t c1 = static_cast<uint8_t>(*frm_nxt);
2418 if ((frm_end-frm_nxt < 2) || ((frm_nxt[1] & 0xC0) != 0x80))
2420 if ((((c1 & 0x1Fu) << 6) | (frm_nxt[1] & 0x3Fu)) > Maxcode)
2426 if (frm_end-frm_nxt < 3)
2428 uint8_t c2 = frm_nxt[1];
2429 uint8_t c3 = frm_nxt[2];
2433 if ((c2 & 0xE0) != 0xA0)
2434 return static_cast<int>(frm_nxt - frm);
2437 if ((c2 & 0xE0) != 0x80)
2438 return static_cast<int>(frm_nxt - frm);
2441 if ((c2 & 0xC0) != 0x80)
2442 return static_cast<int>(frm_nxt - frm);
2445 if ((c3 & 0xC0) != 0x80)
2447 if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode)
2453 if (frm_end-frm_nxt < 4)
2455 uint8_t c2 = frm_nxt[1];
2456 uint8_t c3 = frm_nxt[2];
2457 uint8_t c4 = frm_nxt[3];
2461 if (!(0x90 <= c2 && c2 <= 0xBF))
2462 return static_cast<int>(frm_nxt - frm);
2465 if ((c2 & 0xF0) != 0x80)
2466 return static_cast<int>(frm_nxt - frm);
2469 if ((c2 & 0xC0) != 0x80)
2470 return static_cast<int>(frm_nxt - frm);
2473 if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
2475 if ((((c1 & 0x07u) << 18) | ((c2 & 0x3Fu) << 12) |
2476 ((c3 & 0x3Fu) << 6) | (c4 & 0x3Fu)) > Maxcode)
2485 return static_cast<int>(frm_nxt - frm);
2489 codecvt_base::result
2490 ucs2_to_utf8(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt,
2491 uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
2492 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2496 if (mode & generate_header)
2498 if (to_end-to_nxt < 3)
2499 return codecvt_base::partial;
2500 *to_nxt++ = static_cast<uint8_t>(0xEF);
2501 *to_nxt++ = static_cast<uint8_t>(0xBB);
2502 *to_nxt++ = static_cast<uint8_t>(0xBF);
2504 for (; frm_nxt < frm_end; ++frm_nxt)
2506 uint16_t wc = *frm_nxt;
2507 if ((wc & 0xF800) == 0xD800 || wc > Maxcode)
2508 return codecvt_base::error;
2511 if (to_end-to_nxt < 1)
2512 return codecvt_base::partial;
2513 *to_nxt++ = static_cast<uint8_t>(wc);
2515 else if (wc < 0x0800)
2517 if (to_end-to_nxt < 2)
2518 return codecvt_base::partial;
2519 *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc >> 6));
2520 *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x03F));
2522 else // if (wc <= 0xFFFF)
2524 if (to_end-to_nxt < 3)
2525 return codecvt_base::partial;
2526 *to_nxt++ = static_cast<uint8_t>(0xE0 | (wc >> 12));
2527 *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x0FC0) >> 6));
2528 *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x003F));
2531 return codecvt_base::ok;
2535 codecvt_base::result
2536 utf8_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
2537 uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt,
2538 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2542 if (mode & consume_header)
2544 if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
2548 for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt)
2550 uint8_t c1 = static_cast<uint8_t>(*frm_nxt);
2554 return codecvt_base::error;
2555 *to_nxt = static_cast<uint16_t>(c1);
2560 return codecvt_base::error;
2564 if (frm_end-frm_nxt < 2)
2565 return codecvt_base::partial;
2566 uint8_t c2 = frm_nxt[1];
2567 if ((c2 & 0xC0) != 0x80)
2568 return codecvt_base::error;
2569 uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6)
2572 return codecvt_base::error;
2578 if (frm_end-frm_nxt < 3)
2579 return codecvt_base::partial;
2580 uint8_t c2 = frm_nxt[1];
2581 uint8_t c3 = frm_nxt[2];
2585 if ((c2 & 0xE0) != 0xA0)
2586 return codecvt_base::error;
2589 if ((c2 & 0xE0) != 0x80)
2590 return codecvt_base::error;
2593 if ((c2 & 0xC0) != 0x80)
2594 return codecvt_base::error;
2597 if ((c3 & 0xC0) != 0x80)
2598 return codecvt_base::error;
2599 uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12)
2600 | ((c2 & 0x3F) << 6)
2603 return codecvt_base::error;
2609 return codecvt_base::error;
2612 return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2617 utf8_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end,
2618 size_t mx, unsigned long Maxcode = 0x10FFFF,
2619 codecvt_mode mode = codecvt_mode(0))
2621 const uint8_t* frm_nxt = frm;
2622 if (mode & consume_header)
2624 if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
2628 for (size_t nchar32_t = 0; frm_nxt < frm_end && nchar32_t < mx; ++nchar32_t)
2630 uint8_t c1 = static_cast<uint8_t>(*frm_nxt);
2643 if ((frm_end-frm_nxt < 2) || ((frm_nxt[1] & 0xC0) != 0x80))
2645 if ((((c1 & 0x1Fu) << 6) | (frm_nxt[1] & 0x3Fu)) > Maxcode)
2651 if (frm_end-frm_nxt < 3)
2653 uint8_t c2 = frm_nxt[1];
2654 uint8_t c3 = frm_nxt[2];
2658 if ((c2 & 0xE0) != 0xA0)
2659 return static_cast<int>(frm_nxt - frm);
2662 if ((c2 & 0xE0) != 0x80)
2663 return static_cast<int>(frm_nxt - frm);
2666 if ((c2 & 0xC0) != 0x80)
2667 return static_cast<int>(frm_nxt - frm);
2670 if ((c3 & 0xC0) != 0x80)
2672 if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode)
2681 return static_cast<int>(frm_nxt - frm);
2685 codecvt_base::result
2686 ucs4_to_utf16be(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt,
2687 uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
2688 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2692 if (mode & generate_header)
2694 if (to_end-to_nxt < 2)
2695 return codecvt_base::partial;
2696 *to_nxt++ = static_cast<uint8_t>(0xFE);
2697 *to_nxt++ = static_cast<uint8_t>(0xFF);
2699 for (; frm_nxt < frm_end; ++frm_nxt)
2701 uint32_t wc = *frm_nxt;
2702 if ((wc & 0xFFFFF800) == 0x00D800 || wc > Maxcode)
2703 return codecvt_base::error;
2706 if (to_end-to_nxt < 2)
2707 return codecvt_base::partial;
2708 *to_nxt++ = static_cast<uint8_t>(wc >> 8);
2709 *to_nxt++ = static_cast<uint8_t>(wc);
2713 if (to_end-to_nxt < 4)
2714 return codecvt_base::partial;
2715 uint16_t t = static_cast<uint16_t>(
2717 | ((((wc & 0x1F0000) >> 16) - 1) << 6)
2718 | ((wc & 0x00FC00) >> 10));
2719 *to_nxt++ = static_cast<uint8_t>(t >> 8);
2720 *to_nxt++ = static_cast<uint8_t>(t);
2721 t = static_cast<uint16_t>(0xDC00 | (wc & 0x03FF));
2722 *to_nxt++ = static_cast<uint8_t>(t >> 8);
2723 *to_nxt++ = static_cast<uint8_t>(t);
2726 return codecvt_base::ok;
2730 codecvt_base::result
2731 utf16be_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
2732 uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt,
2733 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2737 if (mode & consume_header)
2739 if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF)
2742 for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt)
2744 uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]);
2745 if ((c1 & 0xFC00) == 0xDC00)
2746 return codecvt_base::error;
2747 if ((c1 & 0xFC00) != 0xD800)
2750 return codecvt_base::error;
2751 *to_nxt = static_cast<uint32_t>(c1);
2756 if (frm_end-frm_nxt < 4)
2757 return codecvt_base::partial;
2758 uint16_t c2 = static_cast<uint16_t>(frm_nxt[2] << 8 | frm_nxt[3]);
2759 if ((c2 & 0xFC00) != 0xDC00)
2760 return codecvt_base::error;
2761 uint32_t t = static_cast<uint32_t>(
2762 ((((c1 & 0x03C0) >> 6) + 1) << 16)
2763 | ((c1 & 0x003F) << 10)
2766 return codecvt_base::error;
2771 return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2776 utf16be_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end,
2777 size_t mx, unsigned long Maxcode = 0x10FFFF,
2778 codecvt_mode mode = codecvt_mode(0))
2780 const uint8_t* frm_nxt = frm;
2781 if (mode & consume_header)
2783 if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF)
2786 for (size_t nchar32_t = 0; frm_nxt < frm_end - 1 && nchar32_t < mx; ++nchar32_t)
2788 uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]);
2789 if ((c1 & 0xFC00) == 0xDC00)
2791 if ((c1 & 0xFC00) != 0xD800)
2799 if (frm_end-frm_nxt < 4)
2801 uint16_t c2 = static_cast<uint16_t>(frm_nxt[2] << 8 | frm_nxt[3]);
2802 if ((c2 & 0xFC00) != 0xDC00)
2804 uint32_t t = static_cast<uint32_t>(
2805 ((((c1 & 0x03C0) >> 6) + 1) << 16)
2806 | ((c1 & 0x003F) << 10)
2813 return static_cast<int>(frm_nxt - frm);
2817 codecvt_base::result
2818 ucs4_to_utf16le(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt,
2819 uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
2820 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2824 if (mode & generate_header)
2826 if (to_end - to_nxt < 2)
2827 return codecvt_base::partial;
2828 *to_nxt++ = static_cast<uint8_t>(0xFF);
2829 *to_nxt++ = static_cast<uint8_t>(0xFE);
2831 for (; frm_nxt < frm_end; ++frm_nxt)
2833 uint32_t wc = *frm_nxt;
2834 if ((wc & 0xFFFFF800) == 0x00D800 || wc > Maxcode)
2835 return codecvt_base::error;
2838 if (to_end-to_nxt < 2)
2839 return codecvt_base::partial;
2840 *to_nxt++ = static_cast<uint8_t>(wc);
2841 *to_nxt++ = static_cast<uint8_t>(wc >> 8);
2845 if (to_end-to_nxt < 4)
2846 return codecvt_base::partial;
2847 uint16_t t = static_cast<uint16_t>(
2849 | ((((wc & 0x1F0000) >> 16) - 1) << 6)
2850 | ((wc & 0x00FC00) >> 10));
2851 *to_nxt++ = static_cast<uint8_t>(t);
2852 *to_nxt++ = static_cast<uint8_t>(t >> 8);
2853 t = static_cast<uint16_t>(0xDC00 | (wc & 0x03FF));
2854 *to_nxt++ = static_cast<uint8_t>(t);
2855 *to_nxt++ = static_cast<uint8_t>(t >> 8);
2858 return codecvt_base::ok;
2862 codecvt_base::result
2863 utf16le_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
2864 uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt,
2865 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2869 if (mode & consume_header)
2871 if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE)
2874 for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt)
2876 uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]);
2877 if ((c1 & 0xFC00) == 0xDC00)
2878 return codecvt_base::error;
2879 if ((c1 & 0xFC00) != 0xD800)
2882 return codecvt_base::error;
2883 *to_nxt = static_cast<uint32_t>(c1);
2888 if (frm_end-frm_nxt < 4)
2889 return codecvt_base::partial;
2890 uint16_t c2 = static_cast<uint16_t>(frm_nxt[3] << 8 | frm_nxt[2]);
2891 if ((c2 & 0xFC00) != 0xDC00)
2892 return codecvt_base::error;
2893 uint32_t t = static_cast<uint32_t>(
2894 ((((c1 & 0x03C0) >> 6) + 1) << 16)
2895 | ((c1 & 0x003F) << 10)
2898 return codecvt_base::error;
2903 return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2908 utf16le_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end,
2909 size_t mx, unsigned long Maxcode = 0x10FFFF,
2910 codecvt_mode mode = codecvt_mode(0))
2912 const uint8_t* frm_nxt = frm;
2913 if (mode & consume_header)
2915 if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE)
2918 for (size_t nchar32_t = 0; frm_nxt < frm_end - 1 && nchar32_t < mx; ++nchar32_t)
2920 uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]);
2921 if ((c1 & 0xFC00) == 0xDC00)
2923 if ((c1 & 0xFC00) != 0xD800)
2931 if (frm_end-frm_nxt < 4)
2933 uint16_t c2 = static_cast<uint16_t>(frm_nxt[3] << 8 | frm_nxt[2]);
2934 if ((c2 & 0xFC00) != 0xDC00)
2936 uint32_t t = static_cast<uint32_t>(
2937 ((((c1 & 0x03C0) >> 6) + 1) << 16)
2938 | ((c1 & 0x003F) << 10)
2945 return static_cast<int>(frm_nxt - frm);
2949 codecvt_base::result
2950 ucs2_to_utf16be(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt,
2951 uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
2952 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2956 if (mode & generate_header)
2958 if (to_end-to_nxt < 2)
2959 return codecvt_base::partial;
2960 *to_nxt++ = static_cast<uint8_t>(0xFE);
2961 *to_nxt++ = static_cast<uint8_t>(0xFF);
2963 for (; frm_nxt < frm_end; ++frm_nxt)
2965 uint16_t wc = *frm_nxt;
2966 if ((wc & 0xF800) == 0xD800 || wc > Maxcode)
2967 return codecvt_base::error;
2968 if (to_end-to_nxt < 2)
2969 return codecvt_base::partial;
2970 *to_nxt++ = static_cast<uint8_t>(wc >> 8);
2971 *to_nxt++ = static_cast<uint8_t>(wc);
2973 return codecvt_base::ok;
2977 codecvt_base::result
2978 utf16be_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
2979 uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt,
2980 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2984 if (mode & consume_header)
2986 if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF)
2989 for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt)
2991 uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]);
2992 if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode)
2993 return codecvt_base::error;
2997 return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
3002 utf16be_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end,
3003 size_t mx, unsigned long Maxcode = 0x10FFFF,
3004 codecvt_mode mode = codecvt_mode(0))
3006 const uint8_t* frm_nxt = frm;
3007 if (mode & consume_header)
3009 if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF)
3012 for (size_t nchar16_t = 0; frm_nxt < frm_end - 1 && nchar16_t < mx; ++nchar16_t)
3014 uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]);
3015 if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode)
3019 return static_cast<int>(frm_nxt - frm);
3023 codecvt_base::result
3024 ucs2_to_utf16le(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt,
3025 uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
3026 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
3030 if (mode & generate_header)
3032 if (to_end-to_nxt < 2)
3033 return codecvt_base::partial;
3034 *to_nxt++ = static_cast<uint8_t>(0xFF);
3035 *to_nxt++ = static_cast<uint8_t>(0xFE);
3037 for (; frm_nxt < frm_end; ++frm_nxt)
3039 uint16_t wc = *frm_nxt;
3040 if ((wc & 0xF800) == 0xD800 || wc > Maxcode)
3041 return codecvt_base::error;
3042 if (to_end-to_nxt < 2)
3043 return codecvt_base::partial;
3044 *to_nxt++ = static_cast<uint8_t>(wc);
3045 *to_nxt++ = static_cast<uint8_t>(wc >> 8);
3047 return codecvt_base::ok;
3051 codecvt_base::result
3052 utf16le_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
3053 uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt,
3054 unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
3058 if (mode & consume_header)
3060 if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE)
3063 for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt)
3065 uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]);
3066 if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode)
3067 return codecvt_base::error;
3071 return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
3076 utf16le_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end,
3077 size_t mx, unsigned long Maxcode = 0x10FFFF,
3078 codecvt_mode mode = codecvt_mode(0))
3080 const uint8_t* frm_nxt = frm;
3082 if (mode & consume_header)
3084 if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE)
3087 for (size_t nchar16_t = 0; frm_nxt < frm_end - 1 && nchar16_t < mx; ++nchar16_t)
3089 uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]);
3090 if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode)
3094 return static_cast<int>(frm_nxt - frm);
3097 // template <> class codecvt<char16_t, char, mbstate_t>
3099 locale::id codecvt<char16_t, char, mbstate_t>::id;
3101 codecvt<char16_t, char, mbstate_t>::~codecvt()
3105 codecvt<char16_t, char, mbstate_t>::result
3106 codecvt<char16_t, char, mbstate_t>::do_out(state_type&,
3107 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
3108 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
3110 const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
3111 const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
3112 const uint16_t* _frm_nxt = _frm;
3113 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
3114 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
3115 uint8_t* _to_nxt = _to;
3116 result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt);
3117 frm_nxt = frm + (_frm_nxt - _frm);
3118 to_nxt = to + (_to_nxt - _to);
3122 codecvt<char16_t, char, mbstate_t>::result
3123 codecvt<char16_t, char, mbstate_t>::do_in(state_type&,
3124 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
3125 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
3127 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3128 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3129 const uint8_t* _frm_nxt = _frm;
3130 uint16_t* _to = reinterpret_cast<uint16_t*>(to);
3131 uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
3132 uint16_t* _to_nxt = _to;
3133 result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt);
3134 frm_nxt = frm + (_frm_nxt - _frm);
3135 to_nxt = to + (_to_nxt - _to);
3139 codecvt<char16_t, char, mbstate_t>::result
3140 codecvt<char16_t, char, mbstate_t>::do_unshift(state_type&,
3141 extern_type* to, extern_type*, extern_type*& to_nxt) const
3148 codecvt<char16_t, char, mbstate_t>::do_encoding() const _NOEXCEPT
3154 codecvt<char16_t, char, mbstate_t>::do_always_noconv() const _NOEXCEPT
3160 codecvt<char16_t, char, mbstate_t>::do_length(state_type&,
3161 const extern_type* frm, const extern_type* frm_end, size_t mx) const
3163 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3164 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3165 return utf8_to_utf16_length(_frm, _frm_end, mx);
3169 codecvt<char16_t, char, mbstate_t>::do_max_length() const _NOEXCEPT
3174 // template <> class codecvt<char32_t, char, mbstate_t>
3176 locale::id codecvt<char32_t, char, mbstate_t>::id;
3178 codecvt<char32_t, char, mbstate_t>::~codecvt()
3182 codecvt<char32_t, char, mbstate_t>::result
3183 codecvt<char32_t, char, mbstate_t>::do_out(state_type&,
3184 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
3185 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
3187 const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
3188 const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
3189 const uint32_t* _frm_nxt = _frm;
3190 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
3191 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
3192 uint8_t* _to_nxt = _to;
3193 result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt);
3194 frm_nxt = frm + (_frm_nxt - _frm);
3195 to_nxt = to + (_to_nxt - _to);
3199 codecvt<char32_t, char, mbstate_t>::result
3200 codecvt<char32_t, char, mbstate_t>::do_in(state_type&,
3201 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
3202 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
3204 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3205 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3206 const uint8_t* _frm_nxt = _frm;
3207 uint32_t* _to = reinterpret_cast<uint32_t*>(to);
3208 uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
3209 uint32_t* _to_nxt = _to;
3210 result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt);
3211 frm_nxt = frm + (_frm_nxt - _frm);
3212 to_nxt = to + (_to_nxt - _to);
3216 codecvt<char32_t, char, mbstate_t>::result
3217 codecvt<char32_t, char, mbstate_t>::do_unshift(state_type&,
3218 extern_type* to, extern_type*, extern_type*& to_nxt) const
3225 codecvt<char32_t, char, mbstate_t>::do_encoding() const _NOEXCEPT
3231 codecvt<char32_t, char, mbstate_t>::do_always_noconv() const _NOEXCEPT
3237 codecvt<char32_t, char, mbstate_t>::do_length(state_type&,
3238 const extern_type* frm, const extern_type* frm_end, size_t mx) const
3240 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3241 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3242 return utf8_to_ucs4_length(_frm, _frm_end, mx);
3246 codecvt<char32_t, char, mbstate_t>::do_max_length() const _NOEXCEPT
3251 // __codecvt_utf8<wchar_t>
3253 __codecvt_utf8<wchar_t>::result
3254 __codecvt_utf8<wchar_t>::do_out(state_type&,
3255 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
3256 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
3259 const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
3260 const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
3261 const uint16_t* _frm_nxt = _frm;
3263 const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
3264 const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
3265 const uint32_t* _frm_nxt = _frm;
3267 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
3268 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
3269 uint8_t* _to_nxt = _to;
3271 result r = ucs2_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3274 result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3277 frm_nxt = frm + (_frm_nxt - _frm);
3278 to_nxt = to + (_to_nxt - _to);
3282 __codecvt_utf8<wchar_t>::result
3283 __codecvt_utf8<wchar_t>::do_in(state_type&,
3284 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
3285 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
3287 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3288 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3289 const uint8_t* _frm_nxt = _frm;
3291 uint16_t* _to = reinterpret_cast<uint16_t*>(to);
3292 uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
3293 uint16_t* _to_nxt = _to;
3294 result r = utf8_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3297 uint32_t* _to = reinterpret_cast<uint32_t*>(to);
3298 uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
3299 uint32_t* _to_nxt = _to;
3300 result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3303 frm_nxt = frm + (_frm_nxt - _frm);
3304 to_nxt = to + (_to_nxt - _to);
3308 __codecvt_utf8<wchar_t>::result
3309 __codecvt_utf8<wchar_t>::do_unshift(state_type&,
3310 extern_type* to, extern_type*, extern_type*& to_nxt) const
3317 __codecvt_utf8<wchar_t>::do_encoding() const _NOEXCEPT
3323 __codecvt_utf8<wchar_t>::do_always_noconv() const _NOEXCEPT
3329 __codecvt_utf8<wchar_t>::do_length(state_type&,
3330 const extern_type* frm, const extern_type* frm_end, size_t mx) const
3332 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3333 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3334 return utf8_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
3338 __codecvt_utf8<wchar_t>::do_max_length() const _NOEXCEPT
3340 if (_Mode_ & consume_header)
3345 // __codecvt_utf8<char16_t>
3347 __codecvt_utf8<char16_t>::result
3348 __codecvt_utf8<char16_t>::do_out(state_type&,
3349 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
3350 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
3352 const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
3353 const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
3354 const uint16_t* _frm_nxt = _frm;
3355 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
3356 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
3357 uint8_t* _to_nxt = _to;
3358 result r = ucs2_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3360 frm_nxt = frm + (_frm_nxt - _frm);
3361 to_nxt = to + (_to_nxt - _to);
3365 __codecvt_utf8<char16_t>::result
3366 __codecvt_utf8<char16_t>::do_in(state_type&,
3367 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
3368 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
3370 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3371 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3372 const uint8_t* _frm_nxt = _frm;
3373 uint16_t* _to = reinterpret_cast<uint16_t*>(to);
3374 uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
3375 uint16_t* _to_nxt = _to;
3376 result r = utf8_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3378 frm_nxt = frm + (_frm_nxt - _frm);
3379 to_nxt = to + (_to_nxt - _to);
3383 __codecvt_utf8<char16_t>::result
3384 __codecvt_utf8<char16_t>::do_unshift(state_type&,
3385 extern_type* to, extern_type*, extern_type*& to_nxt) const
3392 __codecvt_utf8<char16_t>::do_encoding() const _NOEXCEPT
3398 __codecvt_utf8<char16_t>::do_always_noconv() const _NOEXCEPT
3404 __codecvt_utf8<char16_t>::do_length(state_type&,
3405 const extern_type* frm, const extern_type* frm_end, size_t mx) const
3407 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3408 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3409 return utf8_to_ucs2_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
3413 __codecvt_utf8<char16_t>::do_max_length() const _NOEXCEPT
3415 if (_Mode_ & consume_header)
3420 // __codecvt_utf8<char32_t>
3422 __codecvt_utf8<char32_t>::result
3423 __codecvt_utf8<char32_t>::do_out(state_type&,
3424 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
3425 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
3427 const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
3428 const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
3429 const uint32_t* _frm_nxt = _frm;
3430 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
3431 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
3432 uint8_t* _to_nxt = _to;
3433 result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3435 frm_nxt = frm + (_frm_nxt - _frm);
3436 to_nxt = to + (_to_nxt - _to);
3440 __codecvt_utf8<char32_t>::result
3441 __codecvt_utf8<char32_t>::do_in(state_type&,
3442 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
3443 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
3445 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3446 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3447 const uint8_t* _frm_nxt = _frm;
3448 uint32_t* _to = reinterpret_cast<uint32_t*>(to);
3449 uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
3450 uint32_t* _to_nxt = _to;
3451 result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3453 frm_nxt = frm + (_frm_nxt - _frm);
3454 to_nxt = to + (_to_nxt - _to);
3458 __codecvt_utf8<char32_t>::result
3459 __codecvt_utf8<char32_t>::do_unshift(state_type&,
3460 extern_type* to, extern_type*, extern_type*& to_nxt) const
3467 __codecvt_utf8<char32_t>::do_encoding() const _NOEXCEPT
3473 __codecvt_utf8<char32_t>::do_always_noconv() const _NOEXCEPT
3479 __codecvt_utf8<char32_t>::do_length(state_type&,
3480 const extern_type* frm, const extern_type* frm_end, size_t mx) const
3482 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3483 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3484 return utf8_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
3488 __codecvt_utf8<char32_t>::do_max_length() const _NOEXCEPT
3490 if (_Mode_ & consume_header)
3495 // __codecvt_utf16<wchar_t, false>
3497 __codecvt_utf16<wchar_t, false>::result
3498 __codecvt_utf16<wchar_t, false>::do_out(state_type&,
3499 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
3500 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
3502 const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
3503 const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
3504 const uint32_t* _frm_nxt = _frm;
3505 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
3506 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
3507 uint8_t* _to_nxt = _to;
3508 result r = ucs4_to_utf16be(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3510 frm_nxt = frm + (_frm_nxt - _frm);
3511 to_nxt = to + (_to_nxt - _to);
3515 __codecvt_utf16<wchar_t, false>::result
3516 __codecvt_utf16<wchar_t, false>::do_in(state_type&,
3517 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
3518 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
3520 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3521 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3522 const uint8_t* _frm_nxt = _frm;
3523 uint32_t* _to = reinterpret_cast<uint32_t*>(to);
3524 uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
3525 uint32_t* _to_nxt = _to;
3526 result r = utf16be_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3528 frm_nxt = frm + (_frm_nxt - _frm);
3529 to_nxt = to + (_to_nxt - _to);
3533 __codecvt_utf16<wchar_t, false>::result
3534 __codecvt_utf16<wchar_t, false>::do_unshift(state_type&,
3535 extern_type* to, extern_type*, extern_type*& to_nxt) const
3542 __codecvt_utf16<wchar_t, false>::do_encoding() const _NOEXCEPT
3548 __codecvt_utf16<wchar_t, false>::do_always_noconv() const _NOEXCEPT
3554 __codecvt_utf16<wchar_t, false>::do_length(state_type&,
3555 const extern_type* frm, const extern_type* frm_end, size_t mx) const
3557 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3558 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3559 return utf16be_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
3563 __codecvt_utf16<wchar_t, false>::do_max_length() const _NOEXCEPT
3565 if (_Mode_ & consume_header)
3570 // __codecvt_utf16<wchar_t, true>
3572 __codecvt_utf16<wchar_t, true>::result
3573 __codecvt_utf16<wchar_t, true>::do_out(state_type&,
3574 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
3575 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
3577 const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
3578 const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
3579 const uint32_t* _frm_nxt = _frm;
3580 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
3581 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
3582 uint8_t* _to_nxt = _to;
3583 result r = ucs4_to_utf16le(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3585 frm_nxt = frm + (_frm_nxt - _frm);
3586 to_nxt = to + (_to_nxt - _to);
3590 __codecvt_utf16<wchar_t, true>::result
3591 __codecvt_utf16<wchar_t, true>::do_in(state_type&,
3592 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
3593 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
3595 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3596 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3597 const uint8_t* _frm_nxt = _frm;
3598 uint32_t* _to = reinterpret_cast<uint32_t*>(to);
3599 uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
3600 uint32_t* _to_nxt = _to;
3601 result r = utf16le_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3603 frm_nxt = frm + (_frm_nxt - _frm);
3604 to_nxt = to + (_to_nxt - _to);
3608 __codecvt_utf16<wchar_t, true>::result
3609 __codecvt_utf16<wchar_t, true>::do_unshift(state_type&,
3610 extern_type* to, extern_type*, extern_type*& to_nxt) const
3617 __codecvt_utf16<wchar_t, true>::do_encoding() const _NOEXCEPT
3623 __codecvt_utf16<wchar_t, true>::do_always_noconv() const _NOEXCEPT
3629 __codecvt_utf16<wchar_t, true>::do_length(state_type&,
3630 const extern_type* frm, const extern_type* frm_end, size_t mx) const
3632 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3633 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3634 return utf16le_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
3638 __codecvt_utf16<wchar_t, true>::do_max_length() const _NOEXCEPT
3640 if (_Mode_ & consume_header)
3645 // __codecvt_utf16<char16_t, false>
3647 __codecvt_utf16<char16_t, false>::result
3648 __codecvt_utf16<char16_t, false>::do_out(state_type&,
3649 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
3650 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
3652 const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
3653 const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
3654 const uint16_t* _frm_nxt = _frm;
3655 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
3656 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
3657 uint8_t* _to_nxt = _to;
3658 result r = ucs2_to_utf16be(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3660 frm_nxt = frm + (_frm_nxt - _frm);
3661 to_nxt = to + (_to_nxt - _to);
3665 __codecvt_utf16<char16_t, false>::result
3666 __codecvt_utf16<char16_t, false>::do_in(state_type&,
3667 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
3668 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
3670 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3671 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3672 const uint8_t* _frm_nxt = _frm;
3673 uint16_t* _to = reinterpret_cast<uint16_t*>(to);
3674 uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
3675 uint16_t* _to_nxt = _to;
3676 result r = utf16be_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3678 frm_nxt = frm + (_frm_nxt - _frm);
3679 to_nxt = to + (_to_nxt - _to);
3683 __codecvt_utf16<char16_t, false>::result
3684 __codecvt_utf16<char16_t, false>::do_unshift(state_type&,
3685 extern_type* to, extern_type*, extern_type*& to_nxt) const
3692 __codecvt_utf16<char16_t, false>::do_encoding() const _NOEXCEPT
3698 __codecvt_utf16<char16_t, false>::do_always_noconv() const _NOEXCEPT
3704 __codecvt_utf16<char16_t, false>::do_length(state_type&,
3705 const extern_type* frm, const extern_type* frm_end, size_t mx) const
3707 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3708 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3709 return utf16be_to_ucs2_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
3713 __codecvt_utf16<char16_t, false>::do_max_length() const _NOEXCEPT
3715 if (_Mode_ & consume_header)
3720 // __codecvt_utf16<char16_t, true>
3722 __codecvt_utf16<char16_t, true>::result
3723 __codecvt_utf16<char16_t, true>::do_out(state_type&,
3724 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
3725 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
3727 const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
3728 const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
3729 const uint16_t* _frm_nxt = _frm;
3730 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
3731 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
3732 uint8_t* _to_nxt = _to;
3733 result r = ucs2_to_utf16le(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3735 frm_nxt = frm + (_frm_nxt - _frm);
3736 to_nxt = to + (_to_nxt - _to);
3740 __codecvt_utf16<char16_t, true>::result
3741 __codecvt_utf16<char16_t, true>::do_in(state_type&,
3742 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
3743 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
3745 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3746 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3747 const uint8_t* _frm_nxt = _frm;
3748 uint16_t* _to = reinterpret_cast<uint16_t*>(to);
3749 uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
3750 uint16_t* _to_nxt = _to;
3751 result r = utf16le_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3753 frm_nxt = frm + (_frm_nxt - _frm);
3754 to_nxt = to + (_to_nxt - _to);
3758 __codecvt_utf16<char16_t, true>::result
3759 __codecvt_utf16<char16_t, true>::do_unshift(state_type&,
3760 extern_type* to, extern_type*, extern_type*& to_nxt) const
3767 __codecvt_utf16<char16_t, true>::do_encoding() const _NOEXCEPT
3773 __codecvt_utf16<char16_t, true>::do_always_noconv() const _NOEXCEPT
3779 __codecvt_utf16<char16_t, true>::do_length(state_type&,
3780 const extern_type* frm, const extern_type* frm_end, size_t mx) const
3782 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3783 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3784 return utf16le_to_ucs2_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
3788 __codecvt_utf16<char16_t, true>::do_max_length() const _NOEXCEPT
3790 if (_Mode_ & consume_header)
3795 // __codecvt_utf16<char32_t, false>
3797 __codecvt_utf16<char32_t, false>::result
3798 __codecvt_utf16<char32_t, false>::do_out(state_type&,
3799 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
3800 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
3802 const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
3803 const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
3804 const uint32_t* _frm_nxt = _frm;
3805 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
3806 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
3807 uint8_t* _to_nxt = _to;
3808 result r = ucs4_to_utf16be(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3810 frm_nxt = frm + (_frm_nxt - _frm);
3811 to_nxt = to + (_to_nxt - _to);
3815 __codecvt_utf16<char32_t, false>::result
3816 __codecvt_utf16<char32_t, false>::do_in(state_type&,
3817 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
3818 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
3820 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3821 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3822 const uint8_t* _frm_nxt = _frm;
3823 uint32_t* _to = reinterpret_cast<uint32_t*>(to);
3824 uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
3825 uint32_t* _to_nxt = _to;
3826 result r = utf16be_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3828 frm_nxt = frm + (_frm_nxt - _frm);
3829 to_nxt = to + (_to_nxt - _to);
3833 __codecvt_utf16<char32_t, false>::result
3834 __codecvt_utf16<char32_t, false>::do_unshift(state_type&,
3835 extern_type* to, extern_type*, extern_type*& to_nxt) const
3842 __codecvt_utf16<char32_t, false>::do_encoding() const _NOEXCEPT
3848 __codecvt_utf16<char32_t, false>::do_always_noconv() const _NOEXCEPT
3854 __codecvt_utf16<char32_t, false>::do_length(state_type&,
3855 const extern_type* frm, const extern_type* frm_end, size_t mx) const
3857 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3858 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3859 return utf16be_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
3863 __codecvt_utf16<char32_t, false>::do_max_length() const _NOEXCEPT
3865 if (_Mode_ & consume_header)
3870 // __codecvt_utf16<char32_t, true>
3872 __codecvt_utf16<char32_t, true>::result
3873 __codecvt_utf16<char32_t, true>::do_out(state_type&,
3874 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
3875 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
3877 const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
3878 const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
3879 const uint32_t* _frm_nxt = _frm;
3880 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
3881 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
3882 uint8_t* _to_nxt = _to;
3883 result r = ucs4_to_utf16le(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3885 frm_nxt = frm + (_frm_nxt - _frm);
3886 to_nxt = to + (_to_nxt - _to);
3890 __codecvt_utf16<char32_t, true>::result
3891 __codecvt_utf16<char32_t, true>::do_in(state_type&,
3892 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
3893 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
3895 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3896 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3897 const uint8_t* _frm_nxt = _frm;
3898 uint32_t* _to = reinterpret_cast<uint32_t*>(to);
3899 uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
3900 uint32_t* _to_nxt = _to;
3901 result r = utf16le_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3903 frm_nxt = frm + (_frm_nxt - _frm);
3904 to_nxt = to + (_to_nxt - _to);
3908 __codecvt_utf16<char32_t, true>::result
3909 __codecvt_utf16<char32_t, true>::do_unshift(state_type&,
3910 extern_type* to, extern_type*, extern_type*& to_nxt) const
3917 __codecvt_utf16<char32_t, true>::do_encoding() const _NOEXCEPT
3923 __codecvt_utf16<char32_t, true>::do_always_noconv() const _NOEXCEPT
3929 __codecvt_utf16<char32_t, true>::do_length(state_type&,
3930 const extern_type* frm, const extern_type* frm_end, size_t mx) const
3932 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3933 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3934 return utf16le_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
3938 __codecvt_utf16<char32_t, true>::do_max_length() const _NOEXCEPT
3940 if (_Mode_ & consume_header)
3945 // __codecvt_utf8_utf16<wchar_t>
3947 __codecvt_utf8_utf16<wchar_t>::result
3948 __codecvt_utf8_utf16<wchar_t>::do_out(state_type&,
3949 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
3950 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
3952 const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
3953 const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
3954 const uint32_t* _frm_nxt = _frm;
3955 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
3956 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
3957 uint8_t* _to_nxt = _to;
3958 result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3960 frm_nxt = frm + (_frm_nxt - _frm);
3961 to_nxt = to + (_to_nxt - _to);
3965 __codecvt_utf8_utf16<wchar_t>::result
3966 __codecvt_utf8_utf16<wchar_t>::do_in(state_type&,
3967 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
3968 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
3970 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
3971 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
3972 const uint8_t* _frm_nxt = _frm;
3973 uint32_t* _to = reinterpret_cast<uint32_t*>(to);
3974 uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
3975 uint32_t* _to_nxt = _to;
3976 result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
3978 frm_nxt = frm + (_frm_nxt - _frm);
3979 to_nxt = to + (_to_nxt - _to);
3983 __codecvt_utf8_utf16<wchar_t>::result
3984 __codecvt_utf8_utf16<wchar_t>::do_unshift(state_type&,
3985 extern_type* to, extern_type*, extern_type*& to_nxt) const
3992 __codecvt_utf8_utf16<wchar_t>::do_encoding() const _NOEXCEPT
3998 __codecvt_utf8_utf16<wchar_t>::do_always_noconv() const _NOEXCEPT
4004 __codecvt_utf8_utf16<wchar_t>::do_length(state_type&,
4005 const extern_type* frm, const extern_type* frm_end, size_t mx) const
4007 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
4008 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
4009 return utf8_to_utf16_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
4013 __codecvt_utf8_utf16<wchar_t>::do_max_length() const _NOEXCEPT
4015 if (_Mode_ & consume_header)
4020 // __codecvt_utf8_utf16<char16_t>
4022 __codecvt_utf8_utf16<char16_t>::result
4023 __codecvt_utf8_utf16<char16_t>::do_out(state_type&,
4024 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
4025 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
4027 const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
4028 const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
4029 const uint16_t* _frm_nxt = _frm;
4030 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
4031 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
4032 uint8_t* _to_nxt = _to;
4033 result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
4035 frm_nxt = frm + (_frm_nxt - _frm);
4036 to_nxt = to + (_to_nxt - _to);
4040 __codecvt_utf8_utf16<char16_t>::result
4041 __codecvt_utf8_utf16<char16_t>::do_in(state_type&,
4042 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
4043 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
4045 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
4046 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
4047 const uint8_t* _frm_nxt = _frm;
4048 uint16_t* _to = reinterpret_cast<uint16_t*>(to);
4049 uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
4050 uint16_t* _to_nxt = _to;
4051 result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
4053 frm_nxt = frm + (_frm_nxt - _frm);
4054 to_nxt = to + (_to_nxt - _to);
4058 __codecvt_utf8_utf16<char16_t>::result
4059 __codecvt_utf8_utf16<char16_t>::do_unshift(state_type&,
4060 extern_type* to, extern_type*, extern_type*& to_nxt) const
4067 __codecvt_utf8_utf16<char16_t>::do_encoding() const _NOEXCEPT
4073 __codecvt_utf8_utf16<char16_t>::do_always_noconv() const _NOEXCEPT
4079 __codecvt_utf8_utf16<char16_t>::do_length(state_type&,
4080 const extern_type* frm, const extern_type* frm_end, size_t mx) const
4082 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
4083 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
4084 return utf8_to_utf16_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
4088 __codecvt_utf8_utf16<char16_t>::do_max_length() const _NOEXCEPT
4090 if (_Mode_ & consume_header)
4095 // __codecvt_utf8_utf16<char32_t>
4097 __codecvt_utf8_utf16<char32_t>::result
4098 __codecvt_utf8_utf16<char32_t>::do_out(state_type&,
4099 const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
4100 extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
4102 const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
4103 const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
4104 const uint32_t* _frm_nxt = _frm;
4105 uint8_t* _to = reinterpret_cast<uint8_t*>(to);
4106 uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
4107 uint8_t* _to_nxt = _to;
4108 result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
4110 frm_nxt = frm + (_frm_nxt - _frm);
4111 to_nxt = to + (_to_nxt - _to);
4115 __codecvt_utf8_utf16<char32_t>::result
4116 __codecvt_utf8_utf16<char32_t>::do_in(state_type&,
4117 const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
4118 intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
4120 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
4121 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
4122 const uint8_t* _frm_nxt = _frm;
4123 uint32_t* _to = reinterpret_cast<uint32_t*>(to);
4124 uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
4125 uint32_t* _to_nxt = _to;
4126 result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
4128 frm_nxt = frm + (_frm_nxt - _frm);
4129 to_nxt = to + (_to_nxt - _to);
4133 __codecvt_utf8_utf16<char32_t>::result
4134 __codecvt_utf8_utf16<char32_t>::do_unshift(state_type&,
4135 extern_type* to, extern_type*, extern_type*& to_nxt) const
4142 __codecvt_utf8_utf16<char32_t>::do_encoding() const _NOEXCEPT
4148 __codecvt_utf8_utf16<char32_t>::do_always_noconv() const _NOEXCEPT
4154 __codecvt_utf8_utf16<char32_t>::do_length(state_type&,
4155 const extern_type* frm, const extern_type* frm_end, size_t mx) const
4157 const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
4158 const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
4159 return utf8_to_utf16_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
4163 __codecvt_utf8_utf16<char32_t>::do_max_length() const _NOEXCEPT
4165 if (_Mode_ & consume_header)
4170 // __narrow_to_utf8<16>
4172 __narrow_to_utf8<16>::~__narrow_to_utf8()
4176 // __narrow_to_utf8<32>
4178 __narrow_to_utf8<32>::~__narrow_to_utf8()
4182 // __widen_from_utf8<16>
4184 __widen_from_utf8<16>::~__widen_from_utf8()
4188 // __widen_from_utf8<32>
4190 __widen_from_utf8<32>::~__widen_from_utf8()
4194 // numpunct<char> && numpunct<wchar_t>
4196 locale::id numpunct< char >::id;
4197 locale::id numpunct<wchar_t>::id;
4199 numpunct<char>::numpunct(size_t refs)
4200 : locale::facet(refs),
4201 __decimal_point_('.'),
4202 __thousands_sep_(',')
4206 numpunct<wchar_t>::numpunct(size_t refs)
4207 : locale::facet(refs),
4208 __decimal_point_(L'.'),
4209 __thousands_sep_(L',')
4213 numpunct<char>::~numpunct()
4217 numpunct<wchar_t>::~numpunct()
4221 char numpunct< char >::do_decimal_point() const {return __decimal_point_;}
4222 wchar_t numpunct<wchar_t>::do_decimal_point() const {return __decimal_point_;}
4224 char numpunct< char >::do_thousands_sep() const {return __thousands_sep_;}
4225 wchar_t numpunct<wchar_t>::do_thousands_sep() const {return __thousands_sep_;}
4227 string numpunct< char >::do_grouping() const {return __grouping_;}
4228 string numpunct<wchar_t>::do_grouping() const {return __grouping_;}
4230 string numpunct< char >::do_truename() const {return "true";}
4231 wstring numpunct<wchar_t>::do_truename() const {return L"true";}
4233 string numpunct< char >::do_falsename() const {return "false";}
4234 wstring numpunct<wchar_t>::do_falsename() const {return L"false";}
4236 // numpunct_byname<char>
4238 numpunct_byname<char>::numpunct_byname(const char* nm, size_t refs)
4239 : numpunct<char>(refs)
4244 numpunct_byname<char>::numpunct_byname(const string& nm, size_t refs)
4245 : numpunct<char>(refs)
4250 numpunct_byname<char>::~numpunct_byname()
4255 numpunct_byname<char>::__init(const char* nm)
4257 if (strcmp(nm, "C") != 0)
4259 __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
4260 #ifndef _LIBCPP_NO_EXCEPTIONS
4262 throw runtime_error("numpunct_byname<char>::numpunct_byname"
4263 " failed to construct for " + string(nm));
4264 #endif // _LIBCPP_NO_EXCEPTIONS
4265 lconv* lc = __libcpp_localeconv_l(loc.get());
4266 if (*lc->decimal_point)
4267 __decimal_point_ = *lc->decimal_point;
4268 if (*lc->thousands_sep)
4269 __thousands_sep_ = *lc->thousands_sep;
4270 __grouping_ = lc->grouping;
4271 // localization for truename and falsename is not available
4275 // numpunct_byname<wchar_t>
4277 numpunct_byname<wchar_t>::numpunct_byname(const char* nm, size_t refs)
4278 : numpunct<wchar_t>(refs)
4283 numpunct_byname<wchar_t>::numpunct_byname(const string& nm, size_t refs)
4284 : numpunct<wchar_t>(refs)
4289 numpunct_byname<wchar_t>::~numpunct_byname()
4294 numpunct_byname<wchar_t>::__init(const char* nm)
4296 if (strcmp(nm, "C") != 0)
4298 __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
4299 #ifndef _LIBCPP_NO_EXCEPTIONS
4301 throw runtime_error("numpunct_byname<char>::numpunct_byname"
4302 " failed to construct for " + string(nm));
4303 #endif // _LIBCPP_NO_EXCEPTIONS
4304 lconv* lc = __libcpp_localeconv_l(loc.get());
4305 if (*lc->decimal_point)
4306 __decimal_point_ = *lc->decimal_point;
4307 if (*lc->thousands_sep)
4308 __thousands_sep_ = *lc->thousands_sep;
4309 __grouping_ = lc->grouping;
4310 // locallization for truename and falsename is not available
4317 __num_get_base::__get_base(ios_base& iob)
4319 ios_base::fmtflags __basefield = iob.flags() & ios_base::basefield;
4320 if (__basefield == ios_base::oct)
4322 else if (__basefield == ios_base::hex)
4324 else if (__basefield == 0)
4329 const char __num_get_base::__src[33] = "0123456789abcdefABCDEFxX+-pPiInN";
4332 __check_grouping(const string& __grouping, unsigned* __g, unsigned* __g_end,
4333 ios_base::iostate& __err)
4335 if (__grouping.size() != 0)
4337 reverse(__g, __g_end);
4338 const char* __ig = __grouping.data();
4339 const char* __eg = __ig + __grouping.size();
4340 for (unsigned* __r = __g; __r < __g_end-1; ++__r)
4342 if (0 < *__ig && *__ig < numeric_limits<char>::max())
4344 if (static_cast<unsigned>(*__ig) != *__r)
4346 __err = ios_base::failbit;
4350 if (__eg - __ig > 1)
4353 if (0 < *__ig && *__ig < numeric_limits<char>::max())
4355 if (static_cast<unsigned>(*__ig) < __g_end[-1] || __g_end[-1] == 0)
4356 __err = ios_base::failbit;
4362 __num_put_base::__format_int(char* __fmtp, const char* __len, bool __signd,
4363 ios_base::fmtflags __flags)
4365 if (__flags & ios_base::showpos)
4367 if (__flags & ios_base::showbase)
4370 *__fmtp++ = *__len++;
4371 if ((__flags & ios_base::basefield) == ios_base::oct)
4373 else if ((__flags & ios_base::basefield) == ios_base::hex)
4375 if (__flags & ios_base::uppercase)
4387 __num_put_base::__format_float(char* __fmtp, const char* __len,
4388 ios_base::fmtflags __flags)
4390 bool specify_precision = true;
4391 if (__flags & ios_base::showpos)
4393 if (__flags & ios_base::showpoint)
4395 ios_base::fmtflags floatfield = __flags & ios_base::floatfield;
4396 bool uppercase = (__flags & ios_base::uppercase) != 0;
4397 if (floatfield == (ios_base::fixed | ios_base::scientific))
4398 specify_precision = false;
4405 *__fmtp++ = *__len++;
4406 if (floatfield == ios_base::fixed)
4413 else if (floatfield == ios_base::scientific)
4420 else if (floatfield == (ios_base::fixed | ios_base::scientific))
4434 return specify_precision;
4438 __num_put_base::__identify_padding(char* __nb, char* __ne,
4439 const ios_base& __iob)
4441 switch (__iob.flags() & ios_base::adjustfield)
4443 case ios_base::internal:
4444 if (__nb[0] == '-' || __nb[0] == '+')
4446 if (__ne - __nb >= 2 && __nb[0] == '0'
4447 && (__nb[1] == 'x' || __nb[1] == 'X'))
4450 case ios_base::left:
4452 case ios_base::right:
4465 static string weeks[14];
4466 weeks[0] = "Sunday";
4467 weeks[1] = "Monday";
4468 weeks[2] = "Tuesday";
4469 weeks[3] = "Wednesday";
4470 weeks[4] = "Thursday";
4471 weeks[5] = "Friday";
4472 weeks[6] = "Saturday";
4487 static wstring weeks[14];
4488 weeks[0] = L"Sunday";
4489 weeks[1] = L"Monday";
4490 weeks[2] = L"Tuesday";
4491 weeks[3] = L"Wednesday";
4492 weeks[4] = L"Thursday";
4493 weeks[5] = L"Friday";
4494 weeks[6] = L"Saturday";
4507 __time_get_c_storage<char>::__weeks() const
4509 static const string* weeks = init_weeks();
4515 __time_get_c_storage<wchar_t>::__weeks() const
4517 static const wstring* weeks = init_wweeks();
4525 static string months[24];
4526 months[0] = "January";
4527 months[1] = "February";
4528 months[2] = "March";
4529 months[3] = "April";
4533 months[7] = "August";
4534 months[8] = "September";
4535 months[9] = "October";
4536 months[10] = "November";
4537 months[11] = "December";
4557 static wstring months[24];
4558 months[0] = L"January";
4559 months[1] = L"February";
4560 months[2] = L"March";
4561 months[3] = L"April";
4563 months[5] = L"June";
4564 months[6] = L"July";
4565 months[7] = L"August";
4566 months[8] = L"September";
4567 months[9] = L"October";
4568 months[10] = L"November";
4569 months[11] = L"December";
4570 months[12] = L"Jan";
4571 months[13] = L"Feb";
4572 months[14] = L"Mar";
4573 months[15] = L"Apr";
4574 months[16] = L"May";
4575 months[17] = L"Jun";
4576 months[18] = L"Jul";
4577 months[19] = L"Aug";
4578 months[20] = L"Sep";
4579 months[21] = L"Oct";
4580 months[22] = L"Nov";
4581 months[23] = L"Dec";
4587 __time_get_c_storage<char>::__months() const
4589 static const string* months = init_months();
4595 __time_get_c_storage<wchar_t>::__months() const
4597 static const wstring* months = init_wmonths();
4605 static string am_pm[24];
4615 static wstring am_pm[24];
4623 __time_get_c_storage<char>::__am_pm() const
4625 static const string* am_pm = init_am_pm();
4631 __time_get_c_storage<wchar_t>::__am_pm() const
4633 static const wstring* am_pm = init_wam_pm();
4639 __time_get_c_storage<char>::__x() const
4641 static string s("%m/%d/%y");
4647 __time_get_c_storage<wchar_t>::__x() const
4649 static wstring s(L"%m/%d/%y");
4655 __time_get_c_storage<char>::__X() const
4657 static string s("%H:%M:%S");
4663 __time_get_c_storage<wchar_t>::__X() const
4665 static wstring s(L"%H:%M:%S");
4671 __time_get_c_storage<char>::__c() const
4673 static string s("%a %b %d %H:%M:%S %Y");
4679 __time_get_c_storage<wchar_t>::__c() const
4681 static wstring s(L"%a %b %d %H:%M:%S %Y");
4687 __time_get_c_storage<char>::__r() const
4689 static string s("%I:%M:%S %p");
4695 __time_get_c_storage<wchar_t>::__r() const
4697 static wstring s(L"%I:%M:%S %p");
4703 __time_get::__time_get(const char* nm)
4704 : __loc_(newlocale(LC_ALL_MASK, nm, 0))
4706 #ifndef _LIBCPP_NO_EXCEPTIONS
4708 throw runtime_error("time_get_byname"
4709 " failed to construct for " + string(nm));
4710 #endif // _LIBCPP_NO_EXCEPTIONS
4713 __time_get::__time_get(const string& nm)
4714 : __loc_(newlocale(LC_ALL_MASK, nm.c_str(), 0))
4716 #ifndef _LIBCPP_NO_EXCEPTIONS
4718 throw runtime_error("time_get_byname"
4719 " failed to construct for " + nm);
4720 #endif // _LIBCPP_NO_EXCEPTIONS
4723 __time_get::~__time_get()
4727 #if defined(__clang__)
4728 #pragma clang diagnostic ignored "-Wmissing-field-initializers"
4730 #if defined(__GNUG__)
4731 #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
4736 __time_get_storage<char>::__analyze(char fmt, const ctype<char>& ct)
4752 size_t n = strftime_l(buf, countof(buf), f, &t, __loc_);
4758 if (ct.is(ctype_base::space, *bb))
4760 result.push_back(' ');
4761 for (++bb; bb != be && ct.is(ctype_base::space, *bb); ++bb)
4766 ios_base::iostate err = ios_base::goodbit;
4767 ptrdiff_t i = __scan_keyword(w, be, this->__weeks_, this->__weeks_+14,
4772 result.push_back('%');
4774 result.push_back('A');
4776 result.push_back('a');
4781 i = __scan_keyword(w, be, this->__months_, this->__months_+24,
4786 result.push_back('%');
4788 result.push_back('B');
4790 result.push_back('b');
4791 if (fmt == 'x' && ct.is(ctype_base::digit, this->__months_[i][0]))
4792 result.back() = 'm';
4796 if (this->__am_pm_[0].size() + this->__am_pm_[1].size() > 0)
4799 i = __scan_keyword(w, be, this->__am_pm_, this->__am_pm_+2,
4800 ct, err, false) - this->__am_pm_;
4803 result.push_back('%');
4804 result.push_back('p');
4810 if (ct.is(ctype_base::digit, *bb))
4812 switch(__get_up_to_n_digits(bb, be, err, ct, 4))
4815 result.push_back('%');
4816 result.push_back('w');
4819 result.push_back('%');
4820 result.push_back('u');
4823 result.push_back('%');
4824 result.push_back('I');
4827 result.push_back('%');
4828 result.push_back('m');
4831 result.push_back('%');
4832 result.push_back('H');
4835 result.push_back('%');
4836 result.push_back('d');
4839 result.push_back('%');
4840 result.push_back('M');
4843 result.push_back('%');
4844 result.push_back('S');
4847 result.push_back('%');
4848 result.push_back('y');
4851 result.push_back('%');
4852 result.push_back('j');
4855 result.push_back('%');
4856 result.push_back('Y');
4859 for (; w != bb; ++w)
4860 result.push_back(*w);
4867 result.push_back('%');
4868 result.push_back('%');
4872 result.push_back(*bb);
4878 #if defined(__clang__)
4879 #pragma clang diagnostic ignored "-Wmissing-braces"
4884 __time_get_storage<wchar_t>::__analyze(char fmt, const ctype<wchar_t>& ct)
4900 strftime_l(buf, countof(buf), f, &t, __loc_);
4902 wchar_t* wbb = wbuf;
4904 const char* bb = buf;
4905 size_t j = __libcpp_mbsrtowcs_l( wbb, &bb, countof(wbuf), &mb, __loc_);
4906 if (j == size_t(-1))
4907 __throw_runtime_error("locale not supported");
4908 wchar_t* wbe = wbb + j;
4912 if (ct.is(ctype_base::space, *wbb))
4914 result.push_back(L' ');
4915 for (++wbb; wbb != wbe && ct.is(ctype_base::space, *wbb); ++wbb)
4920 ios_base::iostate err = ios_base::goodbit;
4921 ptrdiff_t i = __scan_keyword(w, wbe, this->__weeks_, this->__weeks_+14,
4926 result.push_back(L'%');
4928 result.push_back(L'A');
4930 result.push_back(L'a');
4935 i = __scan_keyword(w, wbe, this->__months_, this->__months_+24,
4940 result.push_back(L'%');
4942 result.push_back(L'B');
4944 result.push_back(L'b');
4945 if (fmt == 'x' && ct.is(ctype_base::digit, this->__months_[i][0]))
4946 result.back() = L'm';
4950 if (this->__am_pm_[0].size() + this->__am_pm_[1].size() > 0)
4953 i = __scan_keyword(w, wbe, this->__am_pm_, this->__am_pm_+2,
4954 ct, err, false) - this->__am_pm_;
4957 result.push_back(L'%');
4958 result.push_back(L'p');
4964 if (ct.is(ctype_base::digit, *wbb))
4966 switch(__get_up_to_n_digits(wbb, wbe, err, ct, 4))
4969 result.push_back(L'%');
4970 result.push_back(L'w');
4973 result.push_back(L'%');
4974 result.push_back(L'u');
4977 result.push_back(L'%');
4978 result.push_back(L'I');
4981 result.push_back(L'%');
4982 result.push_back(L'm');
4985 result.push_back(L'%');
4986 result.push_back(L'H');
4989 result.push_back(L'%');
4990 result.push_back(L'd');
4993 result.push_back(L'%');
4994 result.push_back(L'M');
4997 result.push_back(L'%');
4998 result.push_back(L'S');
5001 result.push_back(L'%');
5002 result.push_back(L'y');
5005 result.push_back(L'%');
5006 result.push_back(L'j');
5009 result.push_back(L'%');
5010 result.push_back(L'Y');
5013 for (; w != wbb; ++w)
5014 result.push_back(*w);
5019 if (ct.narrow(*wbb, 0) == '%')
5021 result.push_back(L'%');
5022 result.push_back(L'%');
5026 result.push_back(*wbb);
5034 __time_get_storage<char>::init(const ctype<char>& ct)
5039 for (int i = 0; i < 7; ++i)
5042 strftime_l(buf, countof(buf), "%A", &t, __loc_);
5044 strftime_l(buf, countof(buf), "%a", &t, __loc_);
5045 __weeks_[i+7] = buf;
5048 for (int i = 0; i < 12; ++i)
5051 strftime_l(buf, countof(buf), "%B", &t, __loc_);
5053 strftime_l(buf, countof(buf), "%b", &t, __loc_);
5054 __months_[i+12] = buf;
5058 strftime_l(buf, countof(buf), "%p", &t, __loc_);
5061 strftime_l(buf, countof(buf), "%p", &t, __loc_);
5063 __c_ = __analyze('c', ct);
5064 __r_ = __analyze('r', ct);
5065 __x_ = __analyze('x', ct);
5066 __X_ = __analyze('X', ct);
5071 __time_get_storage<wchar_t>::init(const ctype<wchar_t>& ct)
5079 for (int i = 0; i < 7; ++i)
5082 strftime_l(buf, countof(buf), "%A", &t, __loc_);
5084 const char* bb = buf;
5085 size_t j = __libcpp_mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5086 if (j == size_t(-1))
5087 __throw_runtime_error("locale not supported");
5089 __weeks_[i].assign(wbuf, wbe);
5090 strftime_l(buf, countof(buf), "%a", &t, __loc_);
5093 j = __libcpp_mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5094 if (j == size_t(-1))
5095 __throw_runtime_error("locale not supported");
5097 __weeks_[i+7].assign(wbuf, wbe);
5100 for (int i = 0; i < 12; ++i)
5103 strftime_l(buf, countof(buf), "%B", &t, __loc_);
5105 const char* bb = buf;
5106 size_t j = __libcpp_mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5107 if (j == size_t(-1))
5108 __throw_runtime_error("locale not supported");
5110 __months_[i].assign(wbuf, wbe);
5111 strftime_l(buf, countof(buf), "%b", &t, __loc_);
5114 j = __libcpp_mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5115 if (j == size_t(-1))
5116 __throw_runtime_error("locale not supported");
5118 __months_[i+12].assign(wbuf, wbe);
5122 strftime_l(buf, countof(buf), "%p", &t, __loc_);
5124 const char* bb = buf;
5125 size_t j = __libcpp_mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5126 if (j == size_t(-1))
5127 __throw_runtime_error("locale not supported");
5129 __am_pm_[0].assign(wbuf, wbe);
5131 strftime_l(buf, countof(buf), "%p", &t, __loc_);
5134 j = __libcpp_mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5135 if (j == size_t(-1))
5136 __throw_runtime_error("locale not supported");
5138 __am_pm_[1].assign(wbuf, wbe);
5139 __c_ = __analyze('c', ct);
5140 __r_ = __analyze('r', ct);
5141 __x_ = __analyze('x', ct);
5142 __X_ = __analyze('X', ct);
5145 template <class CharT>
5146 struct _LIBCPP_HIDDEN __time_get_temp
5147 : public ctype_byname<CharT>
5149 explicit __time_get_temp(const char* nm)
5150 : ctype_byname<CharT>(nm, 1) {}
5151 explicit __time_get_temp(const string& nm)
5152 : ctype_byname<CharT>(nm, 1) {}
5156 __time_get_storage<char>::__time_get_storage(const char* __nm)
5159 const __time_get_temp<char> ct(__nm);
5164 __time_get_storage<char>::__time_get_storage(const string& __nm)
5167 const __time_get_temp<char> ct(__nm);
5172 __time_get_storage<wchar_t>::__time_get_storage(const char* __nm)
5175 const __time_get_temp<wchar_t> ct(__nm);
5180 __time_get_storage<wchar_t>::__time_get_storage(const string& __nm)
5183 const __time_get_temp<wchar_t> ct(__nm);
5188 time_base::dateorder
5189 __time_get_storage<char>::__do_date_order() const
5192 for (i = 0; i < __x_.size(); ++i)
5200 for (++i; i < __x_.size(); ++i)
5203 if (i == __x_.size())
5209 for (++i; i < __x_.size(); ++i)
5212 if (i == __x_.size())
5216 return time_base::ymd;
5219 for (++i; i < __x_.size(); ++i)
5222 if (i == __x_.size())
5226 return time_base::ydm;
5231 for (++i; i < __x_.size(); ++i)
5234 if (i == __x_.size())
5239 for (++i; i < __x_.size(); ++i)
5242 if (i == __x_.size())
5245 if (__x_[i] == 'y' || __x_[i] == 'Y')
5246 return time_base::mdy;
5251 for (++i; i < __x_.size(); ++i)
5254 if (i == __x_.size())
5259 for (++i; i < __x_.size(); ++i)
5262 if (i == __x_.size())
5265 if (__x_[i] == 'y' || __x_[i] == 'Y')
5266 return time_base::dmy;
5271 return time_base::no_order;
5275 time_base::dateorder
5276 __time_get_storage<wchar_t>::__do_date_order() const
5279 for (i = 0; i < __x_.size(); ++i)
5280 if (__x_[i] == L'%')
5287 for (++i; i < __x_.size(); ++i)
5288 if (__x_[i] == L'%')
5290 if (i == __x_.size())
5296 for (++i; i < __x_.size(); ++i)
5297 if (__x_[i] == L'%')
5299 if (i == __x_.size())
5302 if (__x_[i] == L'd')
5303 return time_base::ymd;
5306 for (++i; i < __x_.size(); ++i)
5307 if (__x_[i] == L'%')
5309 if (i == __x_.size())
5312 if (__x_[i] == L'm')
5313 return time_base::ydm;
5318 for (++i; i < __x_.size(); ++i)
5319 if (__x_[i] == L'%')
5321 if (i == __x_.size())
5324 if (__x_[i] == L'd')
5326 for (++i; i < __x_.size(); ++i)
5327 if (__x_[i] == L'%')
5329 if (i == __x_.size())
5332 if (__x_[i] == L'y' || __x_[i] == L'Y')
5333 return time_base::mdy;
5338 for (++i; i < __x_.size(); ++i)
5339 if (__x_[i] == L'%')
5341 if (i == __x_.size())
5344 if (__x_[i] == L'm')
5346 for (++i; i < __x_.size(); ++i)
5347 if (__x_[i] == L'%')
5349 if (i == __x_.size())
5352 if (__x_[i] == L'y' || __x_[i] == L'Y')
5353 return time_base::dmy;
5358 return time_base::no_order;
5363 __time_put::__time_put(const char* nm)
5364 : __loc_(newlocale(LC_ALL_MASK, nm, 0))
5366 #ifndef _LIBCPP_NO_EXCEPTIONS
5368 throw runtime_error("time_put_byname"
5369 " failed to construct for " + string(nm));
5370 #endif // _LIBCPP_NO_EXCEPTIONS
5373 __time_put::__time_put(const string& nm)
5374 : __loc_(newlocale(LC_ALL_MASK, nm.c_str(), 0))
5376 #ifndef _LIBCPP_NO_EXCEPTIONS
5378 throw runtime_error("time_put_byname"
5379 " failed to construct for " + nm);
5380 #endif // _LIBCPP_NO_EXCEPTIONS
5383 __time_put::~__time_put()
5385 if (__loc_ != _LIBCPP_GET_C_LOCALE)
5390 __time_put::__do_put(char* __nb, char*& __ne, const tm* __tm,
5391 char __fmt, char __mod) const
5393 char fmt[] = {'%', __fmt, __mod, 0};
5395 swap(fmt[1], fmt[2]);
5396 size_t n = strftime_l(__nb, countof(__nb, __ne), fmt, __tm, __loc_);
5401 __time_put::__do_put(wchar_t* __wb, wchar_t*& __we, const tm* __tm,
5402 char __fmt, char __mod) const
5405 char* __ne = __nar + 100;
5406 __do_put(__nar, __ne, __tm, __fmt, __mod);
5408 const char* __nb = __nar;
5409 size_t j = __libcpp_mbsrtowcs_l(__wb, &__nb, countof(__wb, __we), &mb, __loc_);
5410 if (j == size_t(-1))
5411 __throw_runtime_error("locale not supported");
5415 // moneypunct_byname
5417 template <class charT>
5420 __init_pat(money_base::pattern& pat, basic_string<charT>& __curr_symbol_,
5421 bool intl, char cs_precedes, char sep_by_space, char sign_posn,
5424 const char sign = static_cast<char>(money_base::sign);
5425 const char space = static_cast<char>(money_base::space);
5426 const char none = static_cast<char>(money_base::none);
5427 const char symbol = static_cast<char>(money_base::symbol);
5428 const char value = static_cast<char>(money_base::value);
5429 const bool symbol_contains_sep = intl && __curr_symbol_.size() == 4;
5431 // Comments on case branches reflect 'C11 7.11.2.1 The localeconv
5432 // function'. "Space between sign and symbol or value" means that
5433 // if the sign is adjacent to the symbol, there's a space between
5434 // them, and otherwise there's a space between the sign and value.
5436 // C11's localeconv specifies that the fourth character of an
5437 // international curr_symbol is used to separate the sign and
5438 // value when sep_by_space says to do so. C++ can't represent
5439 // that, so we just use a space. When sep_by_space says to
5440 // separate the symbol and value-or-sign with a space, we rearrange the
5441 // curr_symbol to put its spacing character on the correct side of
5444 // We also need to avoid adding an extra space between the sign
5445 // and value when the currency symbol is suppressed (by not
5446 // setting showbase). We match glibc's strfmon by interpreting
5447 // sep_by_space==1 as "omit the space when the currency symbol is
5450 // Users who want to get this right should use ICU instead.
5452 switch (cs_precedes)
5454 case 0: // value before curr_symbol
5455 if (symbol_contains_sep) {
5456 // Move the separator to before the symbol, to place it
5457 // between the value and symbol.
5458 rotate(__curr_symbol_.begin(), __curr_symbol_.begin() + 3,
5459 __curr_symbol_.end());
5463 case 0: // Parentheses surround the quantity and currency symbol.
5464 pat.field[0] = sign;
5465 pat.field[1] = value;
5466 pat.field[2] = none; // Any space appears in the symbol.
5467 pat.field[3] = symbol;
5468 switch (sep_by_space)
5470 case 0: // No space separates the currency symbol and value.
5471 // This case may have changed between C99 and C11;
5472 // assume the currency symbol matches the intention.
5473 case 2: // Space between sign and currency or value.
5474 // The "sign" is two parentheses, so no space here either.
5476 case 1: // Space between currency-and-sign or currency and value.
5477 if (!symbol_contains_sep) {
5478 // We insert the space into the symbol instead of
5479 // setting pat.field[2]=space so that when
5480 // showbase is not set, the space goes away too.
5481 __curr_symbol_.insert(0, 1, space_char);
5488 case 1: // The sign string precedes the quantity and currency symbol.
5489 pat.field[0] = sign;
5490 pat.field[3] = symbol;
5491 switch (sep_by_space)
5493 case 0: // No space separates the currency symbol and value.
5494 pat.field[1] = value;
5495 pat.field[2] = none;
5497 case 1: // Space between currency-and-sign or currency and value.
5498 pat.field[1] = value;
5499 pat.field[2] = none;
5500 if (!symbol_contains_sep) {
5501 // We insert the space into the symbol instead of
5502 // setting pat.field[2]=space so that when
5503 // showbase is not set, the space goes away too.
5504 __curr_symbol_.insert(0, 1, space_char);
5507 case 2: // Space between sign and currency or value.
5508 pat.field[1] = space;
5509 pat.field[2] = value;
5510 if (symbol_contains_sep) {
5511 // Remove the separator from the symbol, since it
5512 // has already appeared after the sign.
5513 __curr_symbol_.erase(__curr_symbol_.begin());
5520 case 2: // The sign string succeeds the quantity and currency symbol.
5521 pat.field[0] = value;
5522 pat.field[3] = sign;
5523 switch (sep_by_space)
5525 case 0: // No space separates the currency symbol and value.
5526 pat.field[1] = none;
5527 pat.field[2] = symbol;
5529 case 1: // Space between currency-and-sign or currency and value.
5530 if (!symbol_contains_sep) {
5531 // We insert the space into the symbol instead of
5532 // setting pat.field[1]=space so that when
5533 // showbase is not set, the space goes away too.
5534 __curr_symbol_.insert(0, 1, space_char);
5536 pat.field[1] = none;
5537 pat.field[2] = symbol;
5539 case 2: // Space between sign and currency or value.
5540 pat.field[1] = symbol;
5541 pat.field[2] = space;
5542 if (symbol_contains_sep) {
5543 // Remove the separator from the symbol, since it
5544 // should not be removed if showbase is absent.
5545 __curr_symbol_.erase(__curr_symbol_.begin());
5552 case 3: // The sign string immediately precedes the currency symbol.
5553 pat.field[0] = value;
5554 pat.field[3] = symbol;
5555 switch (sep_by_space)
5557 case 0: // No space separates the currency symbol and value.
5558 pat.field[1] = none;
5559 pat.field[2] = sign;
5561 case 1: // Space between currency-and-sign or currency and value.
5562 pat.field[1] = space;
5563 pat.field[2] = sign;
5564 if (symbol_contains_sep) {
5565 // Remove the separator from the symbol, since it
5566 // has already appeared before the sign.
5567 __curr_symbol_.erase(__curr_symbol_.begin());
5570 case 2: // Space between sign and currency or value.
5571 pat.field[1] = sign;
5572 pat.field[2] = none;
5573 if (!symbol_contains_sep) {
5574 // We insert the space into the symbol instead of
5575 // setting pat.field[2]=space so that when
5576 // showbase is not set, the space goes away too.
5577 __curr_symbol_.insert(0, 1, space_char);
5584 case 4: // The sign string immediately succeeds the currency symbol.
5585 pat.field[0] = value;
5586 pat.field[3] = sign;
5587 switch (sep_by_space)
5589 case 0: // No space separates the currency symbol and value.
5590 pat.field[1] = none;
5591 pat.field[2] = symbol;
5593 case 1: // Space between currency-and-sign or currency and value.
5594 pat.field[1] = none;
5595 pat.field[2] = symbol;
5596 if (!symbol_contains_sep) {
5597 // We insert the space into the symbol instead of
5598 // setting pat.field[1]=space so that when
5599 // showbase is not set, the space goes away too.
5600 __curr_symbol_.insert(0, 1, space_char);
5603 case 2: // Space between sign and currency or value.
5604 pat.field[1] = symbol;
5605 pat.field[2] = space;
5606 if (symbol_contains_sep) {
5607 // Remove the separator from the symbol, since it
5608 // should not disappear when showbase is absent.
5609 __curr_symbol_.erase(__curr_symbol_.begin());
5620 case 1: // curr_symbol before value
5623 case 0: // Parentheses surround the quantity and currency symbol.
5624 pat.field[0] = sign;
5625 pat.field[1] = symbol;
5626 pat.field[2] = none; // Any space appears in the symbol.
5627 pat.field[3] = value;
5628 switch (sep_by_space)
5630 case 0: // No space separates the currency symbol and value.
5631 // This case may have changed between C99 and C11;
5632 // assume the currency symbol matches the intention.
5633 case 2: // Space between sign and currency or value.
5634 // The "sign" is two parentheses, so no space here either.
5636 case 1: // Space between currency-and-sign or currency and value.
5637 if (!symbol_contains_sep) {
5638 // We insert the space into the symbol instead of
5639 // setting pat.field[2]=space so that when
5640 // showbase is not set, the space goes away too.
5641 __curr_symbol_.insert(0, 1, space_char);
5648 case 1: // The sign string precedes the quantity and currency symbol.
5649 pat.field[0] = sign;
5650 pat.field[3] = value;
5651 switch (sep_by_space)
5653 case 0: // No space separates the currency symbol and value.
5654 pat.field[1] = symbol;
5655 pat.field[2] = none;
5657 case 1: // Space between currency-and-sign or currency and value.
5658 pat.field[1] = symbol;
5659 pat.field[2] = none;
5660 if (!symbol_contains_sep) {
5661 // We insert the space into the symbol instead of
5662 // setting pat.field[2]=space so that when
5663 // showbase is not set, the space goes away too.
5664 __curr_symbol_.push_back(space_char);
5667 case 2: // Space between sign and currency or value.
5668 pat.field[1] = space;
5669 pat.field[2] = symbol;
5670 if (symbol_contains_sep) {
5671 // Remove the separator from the symbol, since it
5672 // has already appeared after the sign.
5673 __curr_symbol_.pop_back();
5680 case 2: // The sign string succeeds the quantity and currency symbol.
5681 pat.field[0] = symbol;
5682 pat.field[3] = sign;
5683 switch (sep_by_space)
5685 case 0: // No space separates the currency symbol and value.
5686 pat.field[1] = none;
5687 pat.field[2] = value;
5689 case 1: // Space between currency-and-sign or currency and value.
5690 pat.field[1] = none;
5691 pat.field[2] = value;
5692 if (!symbol_contains_sep) {
5693 // We insert the space into the symbol instead of
5694 // setting pat.field[1]=space so that when
5695 // showbase is not set, the space goes away too.
5696 __curr_symbol_.push_back(space_char);
5699 case 2: // Space between sign and currency or value.
5700 pat.field[1] = value;
5701 pat.field[2] = space;
5702 if (symbol_contains_sep) {
5703 // Remove the separator from the symbol, since it
5704 // will appear before the sign.
5705 __curr_symbol_.pop_back();
5712 case 3: // The sign string immediately precedes the currency symbol.
5713 pat.field[0] = sign;
5714 pat.field[3] = value;
5715 switch (sep_by_space)
5717 case 0: // No space separates the currency symbol and value.
5718 pat.field[1] = symbol;
5719 pat.field[2] = none;
5721 case 1: // Space between currency-and-sign or currency and value.
5722 pat.field[1] = symbol;
5723 pat.field[2] = none;
5724 if (!symbol_contains_sep) {
5725 // We insert the space into the symbol instead of
5726 // setting pat.field[2]=space so that when
5727 // showbase is not set, the space goes away too.
5728 __curr_symbol_.push_back(space_char);
5731 case 2: // Space between sign and currency or value.
5732 pat.field[1] = space;
5733 pat.field[2] = symbol;
5734 if (symbol_contains_sep) {
5735 // Remove the separator from the symbol, since it
5736 // has already appeared after the sign.
5737 __curr_symbol_.pop_back();
5744 case 4: // The sign string immediately succeeds the currency symbol.
5745 pat.field[0] = symbol;
5746 pat.field[3] = value;
5747 switch (sep_by_space)
5749 case 0: // No space separates the currency symbol and value.
5750 pat.field[1] = sign;
5751 pat.field[2] = none;
5753 case 1: // Space between currency-and-sign or currency and value.
5754 pat.field[1] = sign;
5755 pat.field[2] = space;
5756 if (symbol_contains_sep) {
5757 // Remove the separator from the symbol, since it
5758 // should not disappear when showbase is absent.
5759 __curr_symbol_.pop_back();
5762 case 2: // Space between sign and currency or value.
5763 pat.field[1] = none;
5764 pat.field[2] = sign;
5765 if (!symbol_contains_sep) {
5766 // We insert the space into the symbol instead of
5767 // setting pat.field[1]=space so that when
5768 // showbase is not set, the space goes away too.
5769 __curr_symbol_.push_back(space_char);
5783 pat.field[0] = symbol;
5784 pat.field[1] = sign;
5785 pat.field[2] = none;
5786 pat.field[3] = value;
5791 moneypunct_byname<char, false>::init(const char* nm)
5793 typedef moneypunct<char, false> base;
5794 __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
5795 #ifndef _LIBCPP_NO_EXCEPTIONS
5797 throw runtime_error("moneypunct_byname"
5798 " failed to construct for " + string(nm));
5799 #endif // _LIBCPP_NO_EXCEPTIONS
5800 lconv* lc = __libcpp_localeconv_l(loc.get());
5801 if (*lc->mon_decimal_point)
5802 __decimal_point_ = *lc->mon_decimal_point;
5804 __decimal_point_ = base::do_decimal_point();
5805 if (*lc->mon_thousands_sep)
5806 __thousands_sep_ = *lc->mon_thousands_sep;
5808 __thousands_sep_ = base::do_thousands_sep();
5809 __grouping_ = lc->mon_grouping;
5810 __curr_symbol_ = lc->currency_symbol;
5811 if (lc->frac_digits != CHAR_MAX)
5812 __frac_digits_ = lc->frac_digits;
5814 __frac_digits_ = base::do_frac_digits();
5815 if (lc->p_sign_posn == 0)
5816 __positive_sign_ = "()";
5818 __positive_sign_ = lc->positive_sign;
5819 if (lc->n_sign_posn == 0)
5820 __negative_sign_ = "()";
5822 __negative_sign_ = lc->negative_sign;
5823 // Assume the positive and negative formats will want spaces in
5824 // the same places in curr_symbol since there's no way to
5825 // represent anything else.
5826 string_type __dummy_curr_symbol = __curr_symbol_;
5827 __init_pat(__pos_format_, __dummy_curr_symbol, false,
5828 lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, ' ');
5829 __init_pat(__neg_format_, __curr_symbol_, false,
5830 lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, ' ');
5835 moneypunct_byname<char, true>::init(const char* nm)
5837 typedef moneypunct<char, true> base;
5838 __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
5839 #ifndef _LIBCPP_NO_EXCEPTIONS
5841 throw runtime_error("moneypunct_byname"
5842 " failed to construct for " + string(nm));
5843 #endif // _LIBCPP_NO_EXCEPTIONS
5844 lconv* lc = __libcpp_localeconv_l(loc.get());
5845 if (*lc->mon_decimal_point)
5846 __decimal_point_ = *lc->mon_decimal_point;
5848 __decimal_point_ = base::do_decimal_point();
5849 if (*lc->mon_thousands_sep)
5850 __thousands_sep_ = *lc->mon_thousands_sep;
5852 __thousands_sep_ = base::do_thousands_sep();
5853 __grouping_ = lc->mon_grouping;
5854 __curr_symbol_ = lc->int_curr_symbol;
5855 if (lc->int_frac_digits != CHAR_MAX)
5856 __frac_digits_ = lc->int_frac_digits;
5858 __frac_digits_ = base::do_frac_digits();
5859 #if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
5860 if (lc->p_sign_posn == 0)
5861 #else // _LIBCPP_MSVCRT
5862 if (lc->int_p_sign_posn == 0)
5863 #endif // !_LIBCPP_MSVCRT
5864 __positive_sign_ = "()";
5866 __positive_sign_ = lc->positive_sign;
5867 #if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
5868 if(lc->n_sign_posn == 0)
5869 #else // _LIBCPP_MSVCRT
5870 if (lc->int_n_sign_posn == 0)
5871 #endif // !_LIBCPP_MSVCRT
5872 __negative_sign_ = "()";
5874 __negative_sign_ = lc->negative_sign;
5875 // Assume the positive and negative formats will want spaces in
5876 // the same places in curr_symbol since there's no way to
5877 // represent anything else.
5878 string_type __dummy_curr_symbol = __curr_symbol_;
5879 #if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
5880 __init_pat(__pos_format_, __dummy_curr_symbol, true,
5881 lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, ' ');
5882 __init_pat(__neg_format_, __curr_symbol_, true,
5883 lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, ' ');
5884 #else // _LIBCPP_MSVCRT
5885 __init_pat(__pos_format_, __dummy_curr_symbol, true,
5886 lc->int_p_cs_precedes, lc->int_p_sep_by_space,
5887 lc->int_p_sign_posn, ' ');
5888 __init_pat(__neg_format_, __curr_symbol_, true,
5889 lc->int_n_cs_precedes, lc->int_n_sep_by_space,
5890 lc->int_n_sign_posn, ' ');
5891 #endif // !_LIBCPP_MSVCRT
5896 moneypunct_byname<wchar_t, false>::init(const char* nm)
5898 typedef moneypunct<wchar_t, false> base;
5899 __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
5900 #ifndef _LIBCPP_NO_EXCEPTIONS
5902 throw runtime_error("moneypunct_byname"
5903 " failed to construct for " + string(nm));
5904 #endif // _LIBCPP_NO_EXCEPTIONS
5905 lconv* lc = __libcpp_localeconv_l(loc.get());
5906 if (*lc->mon_decimal_point)
5907 __decimal_point_ = static_cast<wchar_t>(*lc->mon_decimal_point);
5909 __decimal_point_ = base::do_decimal_point();
5910 if (*lc->mon_thousands_sep)
5911 __thousands_sep_ = static_cast<wchar_t>(*lc->mon_thousands_sep);
5913 __thousands_sep_ = base::do_thousands_sep();
5914 __grouping_ = lc->mon_grouping;
5917 const char* bb = lc->currency_symbol;
5918 size_t j = __libcpp_mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5919 if (j == size_t(-1))
5920 __throw_runtime_error("locale not supported");
5921 wchar_t* wbe = wbuf + j;
5922 __curr_symbol_.assign(wbuf, wbe);
5923 if (lc->frac_digits != CHAR_MAX)
5924 __frac_digits_ = lc->frac_digits;
5926 __frac_digits_ = base::do_frac_digits();
5927 if (lc->p_sign_posn == 0)
5928 __positive_sign_ = L"()";
5932 bb = lc->positive_sign;
5933 j = __libcpp_mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5934 if (j == size_t(-1))
5935 __throw_runtime_error("locale not supported");
5937 __positive_sign_.assign(wbuf, wbe);
5939 if (lc->n_sign_posn == 0)
5940 __negative_sign_ = L"()";
5944 bb = lc->negative_sign;
5945 j = __libcpp_mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5946 if (j == size_t(-1))
5947 __throw_runtime_error("locale not supported");
5949 __negative_sign_.assign(wbuf, wbe);
5951 // Assume the positive and negative formats will want spaces in
5952 // the same places in curr_symbol since there's no way to
5953 // represent anything else.
5954 string_type __dummy_curr_symbol = __curr_symbol_;
5955 __init_pat(__pos_format_, __dummy_curr_symbol, false,
5956 lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, L' ');
5957 __init_pat(__neg_format_, __curr_symbol_, false,
5958 lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, L' ');
5963 moneypunct_byname<wchar_t, true>::init(const char* nm)
5965 typedef moneypunct<wchar_t, true> base;
5966 __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
5967 #ifndef _LIBCPP_NO_EXCEPTIONS
5969 throw runtime_error("moneypunct_byname"
5970 " failed to construct for " + string(nm));
5971 #endif // _LIBCPP_NO_EXCEPTIONS
5972 lconv* lc = __libcpp_localeconv_l(loc.get());
5973 if (*lc->mon_decimal_point)
5974 __decimal_point_ = static_cast<wchar_t>(*lc->mon_decimal_point);
5976 __decimal_point_ = base::do_decimal_point();
5977 if (*lc->mon_thousands_sep)
5978 __thousands_sep_ = static_cast<wchar_t>(*lc->mon_thousands_sep);
5980 __thousands_sep_ = base::do_thousands_sep();
5981 __grouping_ = lc->mon_grouping;
5984 const char* bb = lc->int_curr_symbol;
5985 size_t j = __libcpp_mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5986 if (j == size_t(-1))
5987 __throw_runtime_error("locale not supported");
5988 wchar_t* wbe = wbuf + j;
5989 __curr_symbol_.assign(wbuf, wbe);
5990 if (lc->int_frac_digits != CHAR_MAX)
5991 __frac_digits_ = lc->int_frac_digits;
5993 __frac_digits_ = base::do_frac_digits();
5994 #if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
5995 if (lc->p_sign_posn == 0)
5996 #else // _LIBCPP_MSVCRT
5997 if (lc->int_p_sign_posn == 0)
5998 #endif // !_LIBCPP_MSVCRT
5999 __positive_sign_ = L"()";
6003 bb = lc->positive_sign;
6004 j = __libcpp_mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
6005 if (j == size_t(-1))
6006 __throw_runtime_error("locale not supported");
6008 __positive_sign_.assign(wbuf, wbe);
6010 #if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
6011 if (lc->n_sign_posn == 0)
6012 #else // _LIBCPP_MSVCRT
6013 if (lc->int_n_sign_posn == 0)
6014 #endif // !_LIBCPP_MSVCRT
6015 __negative_sign_ = L"()";
6019 bb = lc->negative_sign;
6020 j = __libcpp_mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
6021 if (j == size_t(-1))
6022 __throw_runtime_error("locale not supported");
6024 __negative_sign_.assign(wbuf, wbe);
6026 // Assume the positive and negative formats will want spaces in
6027 // the same places in curr_symbol since there's no way to
6028 // represent anything else.
6029 string_type __dummy_curr_symbol = __curr_symbol_;
6030 #if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
6031 __init_pat(__pos_format_, __dummy_curr_symbol, true,
6032 lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, L' ');
6033 __init_pat(__neg_format_, __curr_symbol_, true,
6034 lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, L' ');
6035 #else // _LIBCPP_MSVCRT
6036 __init_pat(__pos_format_, __dummy_curr_symbol, true,
6037 lc->int_p_cs_precedes, lc->int_p_sep_by_space,
6038 lc->int_p_sign_posn, L' ');
6039 __init_pat(__neg_format_, __curr_symbol_, true,
6040 lc->int_n_cs_precedes, lc->int_n_sep_by_space,
6041 lc->int_n_sign_posn, L' ');
6042 #endif // !_LIBCPP_MSVCRT
6045 void __do_nothing(void*) {}
6047 void __throw_runtime_error(const char* msg)
6049 #ifndef _LIBCPP_NO_EXCEPTIONS
6050 throw runtime_error(msg);
6056 template class collate<char>;
6057 template class collate<wchar_t>;
6059 template class num_get<char>;
6060 template class num_get<wchar_t>;
6062 template struct __num_get<char>;
6063 template struct __num_get<wchar_t>;
6065 template class num_put<char>;
6066 template class num_put<wchar_t>;
6068 template struct __num_put<char>;
6069 template struct __num_put<wchar_t>;
6071 template class time_get<char>;
6072 template class time_get<wchar_t>;
6074 template class time_get_byname<char>;
6075 template class time_get_byname<wchar_t>;
6077 template class time_put<char>;
6078 template class time_put<wchar_t>;
6080 template class time_put_byname<char>;
6081 template class time_put_byname<wchar_t>;
6083 template class moneypunct<char, false>;
6084 template class moneypunct<char, true>;
6085 template class moneypunct<wchar_t, false>;
6086 template class moneypunct<wchar_t, true>;
6088 template class moneypunct_byname<char, false>;
6089 template class moneypunct_byname<char, true>;
6090 template class moneypunct_byname<wchar_t, false>;
6091 template class moneypunct_byname<wchar_t, true>;
6093 template class money_get<char>;
6094 template class money_get<wchar_t>;
6096 template class __money_get<char>;
6097 template class __money_get<wchar_t>;
6099 template class money_put<char>;
6100 template class money_put<wchar_t>;
6102 template class __money_put<char>;
6103 template class __money_put<wchar_t>;
6105 template class messages<char>;
6106 template class messages<wchar_t>;
6108 template class messages_byname<char>;
6109 template class messages_byname<wchar_t>;
6111 template class codecvt_byname<char, char, mbstate_t>;
6112 template class codecvt_byname<wchar_t, char, mbstate_t>;
6113 template class codecvt_byname<char16_t, char, mbstate_t>;
6114 template class codecvt_byname<char32_t, char, mbstate_t>;
6116 template class __vector_base_common<true>;
6118 _LIBCPP_END_NAMESPACE_STD