diff options
Diffstat (limited to 'system/lib/libcxx')
31 files changed, 2102 insertions, 1152 deletions
diff --git a/system/lib/libcxx/CREDITS.TXT b/system/lib/libcxx/CREDITS.TXT new file mode 100644 index 00000000..52948510 --- /dev/null +++ b/system/lib/libcxx/CREDITS.TXT @@ -0,0 +1,91 @@ +This file is a partial list of people who have contributed to the LLVM/libc++ +project. If you have contributed a patch or made some other contribution to +LLVM/libc++, please submit a patch to this file to add yourself, and it will be +done! + +The list is sorted by surname and formatted to allow easy grepping and +beautification by scripts. The fields are: name (N), email (E), web-address +(W), PGP key ID and fingerprint (P), description (D), and snail-mail address +(S). + +N: Saleem Abdulrasool +E: compnerd@compnerd.org +D: Minor patches and Linux fixes. + +N: Dimitry Andric +E: dimitry@andric.com +D: Visibility fixes, minor FreeBSD portability patches. + +N: Holger Arnold +E: holgerar@gmail.com +D: Minor fix. + +N: Ruben Van Boxem +E: vanboxem dot ruben at gmail dot com +D: Initial Windows patches. + +N: David Chisnall +E: theraven at theravensnest dot org +D: FreeBSD and Solaris ports, libcxxrt support, some atomics work. + +N: Marshall Clow +E: mclow.lists@gmail.com +E: marshall@idio.com +D: Minor patches and bug fixes. + +N: Google Inc. +D: Copyright owner and contributor of the CityHash algorithm + +N: Howard Hinnant +E: hhinnant@apple.com +D: Architect and primary author of libc++ + +N: Hyeon-bin Jeong +E: tuhertz@gmail.com +D: Minor patches and bug fixes. + +N: Argyrios Kyrtzidis +E: kyrtzidis@apple.com +D: Bug fixes. + +N: Michel Morin +E: mimomorin@gmail.com +D: Minor patches to is_convertible. + +N: Andrew Morrow +E: andrew.c.morrow@gmail.com +D: Minor patches and Linux fixes. + +N: Arvid Picciani +E: aep at exys dot org +D: Minor patches and musl port. + +N: Bjorn Reese +E: breese@users.sourceforge.net +D: Initial regex prototype + +N: Jonathan Sauer +D: Minor patches, mostly related to constexpr + +N: Craig Silverstein +E: csilvers@google.com +D: Implemented Cityhash as the string hash function on 64-bit machines + +N: Richard Smith +D: Minor patches. + +N: Michael van der Westhuizen +E: r1mikey at gmail dot com + +N: Klaas de Vries +E: klaas at klaasgaaf dot nl +D: Minor bug fix. + +N: Zhang Xiongpang +E: zhangxiongpang@gmail.com +D: Minor patches and bug fixes. + +N: Jeffrey Yasskin +E: jyasskin@gmail.com +E: jyasskin@google.com +D: Linux fixes. diff --git a/system/lib/libcxx/LICENSE.txt b/system/lib/libcxx/LICENSE.txt index 926f0676..5ed8ec22 100644 --- a/system/lib/libcxx/LICENSE.txt +++ b/system/lib/libcxx/LICENSE.txt @@ -14,7 +14,7 @@ Full text of the relevant licenses is included below. University of Illinois/NCSA Open Source License -Copyright (c) 2009-2010 by the contributors listed in CREDITS.TXT +Copyright (c) 2009-2013 by the contributors listed in CREDITS.TXT All rights reserved. @@ -55,7 +55,7 @@ SOFTWARE. ============================================================================== -Copyright (c) 2009-2010 by the contributors listed in CREDITS.TXT +Copyright (c) 2009-2013 by the contributors listed in CREDITS.TXT Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/system/lib/libcxx/Makefile b/system/lib/libcxx/Makefile deleted file mode 100644 index 814921ea..00000000 --- a/system/lib/libcxx/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -OBJECTS = \ - algorithm.bc \ - condition_variable.bc \ - future.bc \ - iostream.bc \ - memory.bc \ - random.bc \ - stdexcept.bc \ - system_error.bc \ - utility.bc \ - bind.bc \ - debug.bc \ - hash.bc \ - mutex.bc \ - string.bc \ - thread.bc \ - valarray.bc \ - chrono.bc \ - exception.bc \ - ios.bc \ - locale.bc \ - regex.bc \ - strstream.bc \ - typeinfo.bc - -all: libcxx.bc - -%.bc: %.cpp - $(CXX) $< -o $@ - -libcxx.bc: $(OBJECTS) - $(CXX) $(OBJECTS) -o libcxx.bc - diff --git a/system/lib/libcxx/chrono.cpp b/system/lib/libcxx/chrono.cpp index 416b9501..15a6f466 100644 --- a/system/lib/libcxx/chrono.cpp +++ b/system/lib/libcxx/chrono.cpp @@ -9,7 +9,7 @@ #include "chrono" #include <sys/time.h> //for gettimeofday and timeval -#if __APPLE__ +#ifdef __APPLE__ #include <mach/mach_time.h> // mach_absolute_time, mach_timebase_info_data_t #else /* !__APPLE__ */ #include <cerrno> // errno @@ -24,6 +24,8 @@ namespace chrono // system_clock +const bool system_clock::is_steady; + system_clock::time_point system_clock::now() _NOEXCEPT { @@ -46,7 +48,9 @@ system_clock::from_time_t(time_t t) _NOEXCEPT // steady_clock -#if __APPLE__ +const bool steady_clock::is_steady; + +#ifdef __APPLE__ // mach_absolute_time() * MachInfo.numer / MachInfo.denom is the number of // nanoseconds since the computer booted up. MachInfo.numer and MachInfo.denom // are run time constants supplied by the OS. This clock has no relationship @@ -61,7 +65,7 @@ static steady_clock::rep steady_simplified() { - return mach_absolute_time(); + return static_cast<steady_clock::rep>(mach_absolute_time()); } static diff --git a/system/lib/libcxx/condition_variable.cpp b/system/lib/libcxx/condition_variable.cpp index ca1dca32..de0f6f47 100644 --- a/system/lib/libcxx/condition_variable.cpp +++ b/system/lib/libcxx/condition_variable.cpp @@ -16,18 +16,17 @@ _LIBCPP_BEGIN_NAMESPACE_STD condition_variable::~condition_variable() { - int e = pthread_cond_destroy(&__cv_); -// assert(e == 0); + pthread_cond_destroy(&__cv_); } void -condition_variable::notify_one() +condition_variable::notify_one() _NOEXCEPT { pthread_cond_signal(&__cv_); } void -condition_variable::notify_all() +condition_variable::notify_all() _NOEXCEPT { pthread_cond_broadcast(&__cv_); } @@ -52,10 +51,22 @@ condition_variable::__do_timed_wait(unique_lock<mutex>& lk, __throw_system_error(EPERM, "condition_variable::timed wait: mutex not locked"); nanoseconds d = tp.time_since_epoch(); + if (d > nanoseconds(0x59682F000000E941)) + d = nanoseconds(0x59682F000000E941); timespec ts; seconds s = duration_cast<seconds>(d); - ts.tv_sec = static_cast<decltype(ts.tv_sec)>(s.count()); - ts.tv_nsec = static_cast<decltype(ts.tv_nsec)>((d - s).count()); + typedef decltype(ts.tv_sec) ts_sec; + _LIBCPP_CONSTEXPR ts_sec ts_sec_max = numeric_limits<ts_sec>::max(); + if (s.count() < ts_sec_max) + { + ts.tv_sec = static_cast<ts_sec>(s.count()); + ts.tv_nsec = static_cast<decltype(ts.tv_nsec)>((d - s).count()); + } + else + { + ts.tv_sec = ts_sec_max; + ts.tv_nsec = giga::num - 1; + } int ec = pthread_cond_timedwait(&__cv_, lk.mutex()->native_handle(), &ts); if (ec != 0 && ec != ETIMEDOUT) __throw_system_error(ec, "condition_variable timed_wait failed"); diff --git a/system/lib/libcxx/debug.cpp b/system/lib/libcxx/debug.cpp index 2d2d6432..2d4b094b 100644 --- a/system/lib/libcxx/debug.cpp +++ b/system/lib/libcxx/debug.cpp @@ -17,15 +17,15 @@ _LIBCPP_BEGIN_NAMESPACE_STD -_LIBCPP_VISIBLE +_LIBCPP_FUNC_VIS __libcpp_db* __get_db() { static __libcpp_db db; return &db; -}; +} -_LIBCPP_VISIBLE +_LIBCPP_FUNC_VIS const __libcpp_db* __get_const_db() { @@ -120,20 +120,18 @@ __libcpp_db::__insert_ic(void* __i, const void* __c) { WLock _(mut()); __i_node* i = __insert_iterator(__i); - _LIBCPP_ASSERT(__cbeg_ != __cend_, "Container constructed in a translation unit with debug mode disabled." - " But it is being used in a translation unit with debug mode enabled." - " Enable it in the other translation unit with #define _LIBCPP_DEBUG2 1"); - size_t hc = hash<const void*>()(__c) % (__cend_ - __cbeg_); + const char* errmsg = + "Container constructed in a translation unit with debug mode disabled." + " But it is being used in a translation unit with debug mode enabled." + " Enable it in the other translation unit with #define _LIBCPP_DEBUG2 1"; + _LIBCPP_ASSERT(__cbeg_ != __cend_, errmsg); + size_t hc = hash<const void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); __c_node* c = __cbeg_[hc]; - _LIBCPP_ASSERT(c != nullptr, "Container constructed in a translation unit with debug mode disabled." - " But it is being used in a translation unit with debug mode enabled." - " Enable it in the other translation unit with #define _LIBCPP_DEBUG2 1"); + _LIBCPP_ASSERT(c != nullptr, errmsg); while (c->__c_ != __c) { c = c->__next_; - _LIBCPP_ASSERT(c != nullptr, "Container constructed in a translation unit with debug mode disabled." - " But it is being used in a translation unit with debug mode enabled." - " Enable it in the other translation unit with #define _LIBCPP_DEBUG2 1"); + _LIBCPP_ASSERT(c != nullptr, errmsg); } c->__add(i); i->__c_ = c; @@ -143,12 +141,16 @@ __c_node* __libcpp_db::__insert_c(void* __c) { WLock _(mut()); - if (__csz_ + 1 > __cend_ - __cbeg_) + if (__csz_ + 1 > static_cast<size_t>(__cend_ - __cbeg_)) { - size_t nc = __next_prime(2*(__cend_ - __cbeg_) + 1); + size_t nc = __next_prime(2*static_cast<size_t>(__cend_ - __cbeg_) + 1); __c_node** cbeg = (__c_node**)calloc(nc, sizeof(void*)); if (cbeg == nullptr) +#ifndef _LIBCPP_NO_EXCEPTIONS throw bad_alloc(); +#else + abort(); +#endif for (__c_node** p = __cbeg_; p != __cend_; ++p) { __c_node* q = *p; @@ -165,11 +167,15 @@ __libcpp_db::__insert_c(void* __c) __cbeg_ = cbeg; __cend_ = __cbeg_ + nc; } - size_t hc = hash<void*>()(__c) % (__cend_ - __cbeg_); + size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); __c_node* p = __cbeg_[hc]; __c_node* r = __cbeg_[hc] = (__c_node*)malloc(sizeof(__c_node)); if (__cbeg_[hc] == nullptr) +#ifndef _LIBCPP_NO_EXCEPTIONS throw bad_alloc(); +#else + abort(); +#endif r->__c_ = __c; r->__next_ = p; ++__csz_; @@ -182,7 +188,7 @@ __libcpp_db::__erase_i(void* __i) WLock _(mut()); if (__ibeg_ != __iend_) { - size_t hi = hash<void*>()(__i) % (__iend_ - __ibeg_); + size_t hi = hash<void*>()(__i) % static_cast<size_t>(__iend_ - __ibeg_); __i_node* p = __ibeg_[hi]; if (p != nullptr) { @@ -211,7 +217,7 @@ void __libcpp_db::__invalidate_all(void* __c) { WLock _(mut()); - size_t hc = hash<void*>()(__c) % (__cend_ - __cbeg_); + size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); __c_node* p = __cbeg_[hc]; _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __invalidate_all A"); while (p->__c_ != __c) @@ -230,7 +236,7 @@ __c_node* __libcpp_db::__find_c_and_lock(void* __c) const { mut().lock(); - size_t hc = hash<void*>()(__c) % (__cend_ - __cbeg_); + size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); __c_node* p = __cbeg_[hc]; _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __find_c_and_lock A"); while (p->__c_ != __c) @@ -241,6 +247,20 @@ __libcpp_db::__find_c_and_lock(void* __c) const return p; } +__c_node* +__libcpp_db::__find_c(void* __c) const +{ + size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); + __c_node* p = __cbeg_[hc]; + _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __find_c A"); + while (p->__c_ != __c) + { + p = p->__next_; + _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __find_c B"); + } + return p; +} + void __libcpp_db::unlock() const { @@ -251,7 +271,7 @@ void __libcpp_db::__erase_c(void* __c) { WLock _(mut()); - size_t hc = hash<void*>()(__c) % (__cend_ - __cbeg_); + size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); __c_node* p = __cbeg_[hc]; __c_node* q = nullptr; _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __erase_c A"); @@ -348,7 +368,7 @@ void __libcpp_db::swap(void* c1, void* c2) { WLock _(mut()); - size_t hc = hash<void*>()(c1) % (__cend_ - __cbeg_); + size_t hc = hash<void*>()(c1) % static_cast<size_t>(__cend_ - __cbeg_); __c_node* p1 = __cbeg_[hc]; _LIBCPP_ASSERT(p1 != nullptr, "debug mode internal logic error swap A"); while (p1->__c_ != c1) @@ -356,7 +376,7 @@ __libcpp_db::swap(void* c1, void* c2) p1 = p1->__next_; _LIBCPP_ASSERT(p1 != nullptr, "debug mode internal logic error swap B"); } - hc = hash<void*>()(c2) % (__cend_ - __cbeg_); + hc = hash<void*>()(c2) % static_cast<size_t>(__cend_ - __cbeg_); __c_node* p2 = __cbeg_[hc]; _LIBCPP_ASSERT(p2 != nullptr, "debug mode internal logic error swap C"); while (p2->__c_ != c2) @@ -380,18 +400,47 @@ __libcpp_db::__insert_i(void* __i) __insert_iterator(__i); } +void +__c_node::__add(__i_node* i) +{ + if (end_ == cap_) + { + size_t nc = 2*static_cast<size_t>(cap_ - beg_); + if (nc == 0) + nc = 1; + __i_node** beg = (__i_node**)malloc(nc * sizeof(__i_node*)); + if (beg == nullptr) +#ifndef _LIBCPP_NO_EXCEPTIONS + throw bad_alloc(); +#else + abort(); +#endif + if (nc > 1) + memcpy(beg, beg_, nc/2*sizeof(__i_node*)); + free(beg_); + beg_ = beg; + end_ = beg_ + nc/2; + cap_ = beg_ + nc; + } + *end_++ = i; +} + // private api _LIBCPP_HIDDEN __i_node* __libcpp_db::__insert_iterator(void* __i) { - if (__isz_ + 1 > __iend_ - __ibeg_) + if (__isz_ + 1 > static_cast<size_t>(__iend_ - __ibeg_)) { - size_t nc = __next_prime(2*(__iend_ - __ibeg_) + 1); + size_t nc = __next_prime(2*static_cast<size_t>(__iend_ - __ibeg_) + 1); __i_node** ibeg = (__i_node**)calloc(nc, sizeof(void*)); if (ibeg == nullptr) +#ifndef _LIBCPP_NO_EXCEPTIONS throw bad_alloc(); +#else + abort(); +#endif for (__i_node** p = __ibeg_; p != __iend_; ++p) { __i_node* q = *p; @@ -408,11 +457,15 @@ __libcpp_db::__insert_iterator(void* __i) __ibeg_ = ibeg; __iend_ = __ibeg_ + nc; } - size_t hi = hash<void*>()(__i) % (__iend_ - __ibeg_); + size_t hi = hash<void*>()(__i) % static_cast<size_t>(__iend_ - __ibeg_); __i_node* p = __ibeg_[hi]; __i_node* r = __ibeg_[hi] = (__i_node*)malloc(sizeof(__i_node)); if (r == nullptr) +#ifndef _LIBCPP_NO_EXCEPTIONS throw bad_alloc(); +#else + abort(); +#endif ::new(r) __i_node(__i, p, nullptr); ++__isz_; return r; @@ -425,7 +478,7 @@ __libcpp_db::__find_iterator(const void* __i) const __i_node* r = nullptr; if (__ibeg_ != __iend_) { - size_t h = hash<const void*>()(__i) % (__iend_ - __ibeg_); + size_t h = hash<const void*>()(__i) % static_cast<size_t>(__iend_ - __ibeg_); for (__i_node* nd = __ibeg_[h]; nd != nullptr; nd = nd->__next_) { if (nd->__i_ == __i) @@ -440,34 +493,12 @@ __libcpp_db::__find_iterator(const void* __i) const _LIBCPP_HIDDEN void -__c_node::__add(__i_node* i) -{ - if (end_ == cap_) - { - size_t nc = 2*(cap_ - beg_); - if (nc == 0) - nc = 1; - __i_node** beg = (__i_node**)malloc(nc * sizeof(__i_node*)); - if (beg == nullptr) - throw bad_alloc(); - if (nc > 1) - memcpy(beg, beg_, nc/2*sizeof(__i_node*)); - free(beg_); - beg_ = beg; - end_ = beg_ + nc/2; - cap_ = beg_ + nc; - } - *end_++ = i; -} - -_LIBCPP_HIDDEN -void __c_node::__remove(__i_node* p) { __i_node** r = find(beg_, end_, p); _LIBCPP_ASSERT(r != end_, "debug mode internal logic error __c_node::__remove"); if (--end_ != r) - memmove(r, r+1, (end_ - r)*sizeof(__i_node*)); + memmove(r, r+1, static_cast<size_t>(end_ - r)*sizeof(__i_node*)); } _LIBCPP_END_NAMESPACE_STD diff --git a/system/lib/libcxx/exception.cpp b/system/lib/libcxx/exception.cpp index cba355e9..1d2f6b25 100644 --- a/system/lib/libcxx/exception.cpp +++ b/system/lib/libcxx/exception.cpp @@ -10,69 +10,83 @@ #include "exception" -#if __APPLE__ +#ifndef __has_include +#define __has_include(inc) 0 +#endif + +#ifdef __APPLE__ #include <cxxabi.h> + using namespace __cxxabiv1; - using namespace __cxxabiapple; - // On Darwin, there are two STL shared libraries and a lower level ABI - // shared libray. The globals holding the current terminate handler and - // current unexpected handler are in the ABI library. - #define __terminate_handler __cxxabiapple::__cxa_terminate_handler - #define __unexpected_handler __cxxabiapple::__cxa_unexpected_handler #define HAVE_DEPENDENT_EH_ABI 1 -#elif defined(LIBCXXRT) + #ifndef _LIBCPPABI_VERSION + using namespace __cxxabiapple; + // On Darwin, there are two STL shared libraries and a lower level ABI + // shared libray. The globals holding the current terminate handler and + // current unexpected handler are in the ABI library. + #define __terminate_handler __cxxabiapple::__cxa_terminate_handler + #define __unexpected_handler __cxxabiapple::__cxa_unexpected_handler + #endif // _LIBCPPABI_VERSION +#elif defined(LIBCXXRT) || __has_include(<cxxabi.h>) #include <cxxabi.h> using namespace __cxxabiv1; - #define HAVE_DEPENDENT_EH_ABI 1 -#else // __APPLE__ + #if defined(LIBCXXRT) || defined(_LIBCPPABI_VERSION) + #define HAVE_DEPENDENT_EH_ABI 1 + #endif +#elif !defined(__GLIBCXX__) // __has_include(<cxxabi.h>) static std::terminate_handler __terminate_handler; static std::unexpected_handler __unexpected_handler; -#endif // __APPLE__ +#endif // __has_include(<cxxabi.h>) + +namespace std +{ + +#if !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__) -#ifndef LIBCXXRT // libcxxrt provides implementations of these functions itself. -std::unexpected_handler -std::set_unexpected(std::unexpected_handler func) _NOEXCEPT +unexpected_handler +set_unexpected(unexpected_handler func) _NOEXCEPT { return __sync_lock_test_and_set(&__unexpected_handler, func); } -std::unexpected_handler -std::get_unexpected() _NOEXCEPT +unexpected_handler +get_unexpected() _NOEXCEPT { - return __sync_fetch_and_add(&__unexpected_handler, (std::unexpected_handler)0); + return __sync_fetch_and_add(&__unexpected_handler, (unexpected_handler)0); } -_ATTRIBUTE(noreturn) +_LIBCPP_NORETURN void -std::unexpected() +unexpected() { - (*std::get_unexpected())(); + (*get_unexpected())(); // unexpected handler should not return - std::terminate(); + terminate(); } -std::terminate_handler -std::set_terminate(std::terminate_handler func) _NOEXCEPT +terminate_handler +set_terminate(terminate_handler func) _NOEXCEPT { return __sync_lock_test_and_set(&__terminate_handler, func); } -std::terminate_handler -std::get_terminate() _NOEXCEPT +terminate_handler +get_terminate() _NOEXCEPT { - return __sync_fetch_and_add(&__terminate_handler, (std::terminate_handler)0); + return __sync_fetch_and_add(&__terminate_handler, (terminate_handler)0); } -_ATTRIBUTE(noreturn) +#ifndef EMSCRIPTEN // We provide this in JS +_LIBCPP_NORETURN void -std::terminate() _NOEXCEPT +terminate() _NOEXCEPT { #ifndef _LIBCPP_NO_EXCEPTIONS try { #endif // _LIBCPP_NO_EXCEPTIONS - (*std::get_terminate())(); + (*get_terminate())(); // handler should not return ::abort (); #ifndef _LIBCPP_NO_EXCEPTIONS @@ -84,38 +98,38 @@ std::terminate() _NOEXCEPT } #endif // _LIBCPP_NO_EXCEPTIONS } -#endif // LIBCXXRT +#endif // !EMSCRIPTEN +#endif // !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION) -#ifndef EMSCRIPTEN // This is implemented in Javascript for Emscripten -bool std::uncaught_exception() _NOEXCEPT +#if !defined(LIBCXXRT) && !defined(__GLIBCXX__) && !defined(EMSCRIPTEN) +bool uncaught_exception() _NOEXCEPT { -#if __APPLE__ +#if defined(__APPLE__) || defined(_LIBCPPABI_VERSION) // on Darwin, there is a helper function so __cxa_get_globals is private - return __cxxabiapple::__cxa_uncaught_exception(); -#elif LIBCXXRT - __cxa_eh_globals * globals = __cxa_get_globals(); - return (globals->uncaughtExceptions != 0); + return __cxa_uncaught_exception(); #else // __APPLE__ #warning uncaught_exception not yet implemented ::abort(); #endif // __APPLE__ } -#endif // EMSCRIPTEN -namespace std -{ +#ifndef _LIBCPPABI_VERSION exception::~exception() _NOEXCEPT { } -bad_exception::~bad_exception() _NOEXCEPT +const char* exception::what() const _NOEXCEPT { + return "std::exception"; } -const char* exception::what() const _NOEXCEPT +#endif // _LIBCPPABI_VERSION +#endif //LIBCXXRT +#if !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__) + +bad_exception::~bad_exception() _NOEXCEPT { - return "std::exception"; } const char* bad_exception::what() const _NOEXCEPT @@ -123,6 +137,9 @@ const char* bad_exception::what() const _NOEXCEPT return "std::bad_exception"; } +#endif + + exception_ptr::~exception_ptr() _NOEXCEPT { #if HAVE_DEPENDENT_EH_ABI @@ -169,7 +186,7 @@ nested_exception::~nested_exception() _NOEXCEPT { } -_ATTRIBUTE(noreturn) +_LIBCPP_NORETURN void nested_exception::rethrow_nested() const { @@ -178,15 +195,14 @@ nested_exception::rethrow_nested() const rethrow_exception(__ptr_); } -} // std -std::exception_ptr std::current_exception() _NOEXCEPT +exception_ptr current_exception() _NOEXCEPT { #if HAVE_DEPENDENT_EH_ABI // be nicer if there was a constructor that took a ptr, then // this whole function would be just: // return exception_ptr(__cxa_current_primary_exception()); - std::exception_ptr ptr; + exception_ptr ptr; ptr.__ptr_ = __cxa_current_primary_exception(); return ptr; #else // __APPLE__ @@ -195,7 +211,8 @@ std::exception_ptr std::current_exception() _NOEXCEPT #endif // __APPLE__ } -void std::rethrow_exception(exception_ptr p) +_LIBCPP_NORETURN +void rethrow_exception(exception_ptr p) { #if HAVE_DEPENDENT_EH_ABI __cxa_rethrow_primary_exception(p.__ptr_); @@ -206,3 +223,4 @@ void std::rethrow_exception(exception_ptr p) ::abort(); #endif // __APPLE__ } +} // std diff --git a/system/lib/libcxx/future.cpp b/system/lib/libcxx/future.cpp index ff591105..7d9a5b5d 100644 --- a/system/lib/libcxx/future.cpp +++ b/system/lib/libcxx/future.cpp @@ -29,7 +29,7 @@ __future_error_category::name() const _NOEXCEPT string __future_error_category::message(int ev) const { - switch (ev) + switch (static_cast<future_errc>(ev)) { case future_errc::broken_promise: return string("The associated promise has been destructed prior " @@ -47,7 +47,7 @@ __future_error_category::message(int ev) const } const error_category& -future_category() +future_category() _NOEXCEPT { static __future_error_category __f; return __f; @@ -78,8 +78,8 @@ __assoc_sub_state::set_value() throw future_error(make_error_code(future_errc::promise_already_satisfied)); #endif __state_ |= __constructed | ready; - __lk.unlock(); __cv_.notify_all(); + __lk.unlock(); } void @@ -152,9 +152,9 @@ __assoc_sub_state::__sub_wait(unique_lock<mutex>& __lk) { if (!__is_ready()) { - if (__state_ & deferred) + if (__state_ & static_cast<unsigned>(deferred)) { - __state_ &= ~deferred; + __state_ &= ~static_cast<unsigned>(deferred); __lk.unlock(); __execute(); } diff --git a/system/lib/libcxx/hash.cpp b/system/lib/libcxx/hash.cpp index 728b9bd3..a0135002 100644 --- a/system/lib/libcxx/hash.cpp +++ b/system/lib/libcxx/hash.cpp @@ -10,6 +10,9 @@ #include "__hash_table" #include "algorithm" #include "stdexcept" +#include "type_traits" + +#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare" _LIBCPP_BEGIN_NAMESPACE_STD @@ -144,21 +147,23 @@ const unsigned indices[] = // are fewer potential primes to search, and fewer potential primes to divide // against. +template <size_t _Sz = sizeof(size_t)> inline _LIBCPP_INLINE_VISIBILITY -void -__check_for_overflow(size_t N, integral_constant<size_t, 32>) +typename enable_if<_Sz == 4, void>::type +__check_for_overflow(size_t N) { -#ifndef _LIBCPP_NO_EXCEPTIONS +#ifndef _LIBCPP_NO_EXCEPTIONS if (N > 0xFFFFFFFB) throw overflow_error("__next_prime overflow"); #endif } +template <size_t _Sz = sizeof(size_t)> inline _LIBCPP_INLINE_VISIBILITY -void -__check_for_overflow(size_t N, integral_constant<size_t, 64>) +typename enable_if<_Sz == 8, void>::type +__check_for_overflow(size_t N) { -#ifndef _LIBCPP_NO_EXCEPTIONS +#ifndef _LIBCPP_NO_EXCEPTIONS if (N > 0xFFFFFFFFFFFFFFC5ull) throw overflow_error("__next_prime overflow"); #endif @@ -174,14 +179,14 @@ __next_prime(size_t n) return *std::lower_bound(small_primes, small_primes + N, n); // Else n > largest small_primes // Check for overflow - __check_for_overflow(n, integral_constant<size_t, - sizeof(n) * __CHAR_BIT__>()); + __check_for_overflow(n); // Start searching list of potential primes: L * k0 + indices[in] const size_t M = sizeof(indices) / sizeof(indices[0]); // Select first potential prime >= n // Known a-priori n >= L size_t k0 = n / L; - size_t in = std::lower_bound(indices, indices + M, n - k0 * L) - indices; + size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L) + - indices); n = L * k0 + indices[in]; while (true) { diff --git a/system/lib/libcxx/ios.cpp b/system/lib/libcxx/ios.cpp index 80917a04..732a61bb 100644 --- a/system/lib/libcxx/ios.cpp +++ b/system/lib/libcxx/ios.cpp @@ -401,7 +401,7 @@ ios_base::move(ios_base& rhs) } void -ios_base::swap(ios_base& rhs) +ios_base::swap(ios_base& rhs) _NOEXCEPT { _VSTD::swap(__fmtflags_, rhs.__fmtflags_); _VSTD::swap(__precision_, rhs.__precision_); diff --git a/system/lib/libcxx/iostream.cpp b/system/lib/libcxx/iostream.cpp index 157c3977..7fc71df4 100644 --- a/system/lib/libcxx/iostream.cpp +++ b/system/lib/libcxx/iostream.cpp @@ -9,45 +9,60 @@ #include "__std_stream" #include "string" +#include "new" _LIBCPP_BEGIN_NAMESPACE_STD -static __stdinbuf<char> __cin(stdin); -static __stdoutbuf<char> __cout(stdout); -static __stdoutbuf<char> __cerr(stderr); -static __stdinbuf<wchar_t> __wcin(stdin); -static __stdoutbuf<wchar_t> __wcout(stdout); -static __stdoutbuf<wchar_t> __wcerr(stderr); - -istream cin(&__cin); -ostream cout(&__cout); -ostream cerr(&__cerr); -ostream clog(&__cerr); -wistream wcin(&__wcin); -wostream wcout(&__wcout); -wostream wcerr(&__wcerr); -wostream wclog(&__wcerr); +static mbstate_t state_types[6] = {}; + +_ALIGNAS_TYPE (__stdinbuf<char> ) static char __cin [sizeof(__stdinbuf <char>)]; +_ALIGNAS_TYPE (__stdoutbuf<char>) static char __cout[sizeof(__stdoutbuf<char>)]; +_ALIGNAS_TYPE (__stdoutbuf<char>) static char __cerr[sizeof(__stdoutbuf<char>)]; +_ALIGNAS_TYPE (__stdinbuf<wchar_t> ) static char __wcin [sizeof(__stdinbuf <wchar_t>)]; +_ALIGNAS_TYPE (__stdoutbuf<wchar_t>) static char __wcout[sizeof(__stdoutbuf<wchar_t>)]; +_ALIGNAS_TYPE (__stdoutbuf<wchar_t>) static char __wcerr[sizeof(__stdoutbuf<wchar_t>)]; + +_ALIGNAS_TYPE (istream) char cin [sizeof(istream)]; +_ALIGNAS_TYPE (ostream) char cout[sizeof(ostream)]; +_ALIGNAS_TYPE (ostream) char cerr[sizeof(ostream)]; +_ALIGNAS_TYPE (ostream) char clog[sizeof(ostream)]; +_ALIGNAS_TYPE (wistream) char wcin [sizeof(wistream)]; +_ALIGNAS_TYPE (wostream) char wcout[sizeof(wostream)]; +_ALIGNAS_TYPE (wostream) char wcerr[sizeof(wostream)]; +_ALIGNAS_TYPE (wostream) char wclog[sizeof(wostream)]; ios_base::Init __start_std_streams; ios_base::Init::Init() { - cin.tie(&cout); - _VSTD::unitbuf(cerr); - cerr.tie(&cout); + istream* cin_ptr = ::new(cin) istream(::new(__cin) __stdinbuf <char>(stdin, state_types+0) ); + ostream* cout_ptr = ::new(cout) ostream(::new(__cout) __stdoutbuf<char>(stdout, state_types+1)); + ostream* cerr_ptr = ::new(cerr) ostream(::new(__cerr) __stdoutbuf<char>(stderr, state_types+2)); + ::new(clog) ostream(cerr_ptr->rdbuf()); + cin_ptr->tie(cout_ptr); + _VSTD::unitbuf(*cerr_ptr); + cerr_ptr->tie(cout_ptr); - wcin.tie(&wcout); - _VSTD::unitbuf(wcerr); - wcerr.tie(&wcout); + wistream* wcin_ptr = ::new(wcin) wistream(::new(__wcin) __stdinbuf <wchar_t>(stdin, state_types+3) ); + wostream* wcout_ptr = ::new(wcout) wostream(::new(__wcout) __stdoutbuf<wchar_t>(stdout, state_types+4)); + wostream* wcerr_ptr = ::new(wcerr) wostream(::new(__wcerr) __stdoutbuf<wchar_t>(stderr, state_types+5)); + ::new(wclog) wostream(wcerr_ptr->rdbuf()); + wcin_ptr->tie(wcout_ptr); + _VSTD::unitbuf(*wcerr_ptr); + wcerr_ptr->tie(wcout_ptr); } ios_base::Init::~Init() { - cout.flush(); - clog.flush(); + ostream* cout_ptr = (ostream*)cout; + ostream* clog_ptr = (ostream*)clog; + cout_ptr->flush(); + clog_ptr->flush(); - wcout.flush(); - wclog.flush(); + wostream* wcout_ptr = (wostream*)wcout; + wostream* wclog_ptr = (wostream*)wclog; + wcout_ptr->flush(); + wclog_ptr->flush(); } _LIBCPP_END_NAMESPACE_STD diff --git a/system/lib/libcxx/locale.cpp b/system/lib/libcxx/locale.cpp index 87c47636..d9bc6f9a 100644 --- a/system/lib/libcxx/locale.cpp +++ b/system/lib/libcxx/locale.cpp @@ -7,6 +7,12 @@ // //===----------------------------------------------------------------------===// +// On Solaris, we need to define something to make the C99 parts of localeconv +// visible. +#ifdef __sun__ +#define _LCONV_C99 +#endif + #include "string" #include "locale" #include "codecvt" @@ -19,39 +25,28 @@ #include "cstring" #include "cwctype" #include "__sso_allocator" -#if _WIN32 -#include <locale.h> +#ifdef _WIN32 +#include <support/win32/locale_win32.h> #else // _WIN32 #include <langinfo.h> #endif // _!WIN32 #include <stdlib.h> -#ifdef _LIBCPP_STABLE_APPLE_ABI -namespace { - decltype(MB_CUR_MAX_L(_VSTD::declval<locale_t>())) - inline _LIBCPP_INLINE_VISIBILITY - mb_cur_max_l(locale_t loc) - { - return MB_CUR_MAX_L(loc); - } -} -#endif +// On Linux, wint_t and wchar_t have different signed-ness, and this causes +// lots of noise in the build log, but no bugs that I know of. +#pragma clang diagnostic ignored "-Wsign-conversion" _LIBCPP_BEGIN_NAMESPACE_STD -#ifndef _LIBCPP_STABLE_APPLE_ABI +#ifdef __cloc_defined locale_t __cloc() { // In theory this could create a race condition. In practice // the race condition is non-fatal since it will just create // a little resource leak. Better approach would be appreciated. -#ifdef __APPLE__ - return 0; -#else static locale_t result = newlocale(LC_ALL_MASK, "C", 0); return result; -#endif } -#endif // _LIBCPP_STABLE_APPLE_ABI +#endif // __cloc_defined namespace { @@ -90,14 +85,44 @@ make(A0 a0, A1 a1, A2 a2) return *(T*)&buf; } +template <typename T, size_t N> +inline +_LIBCPP_CONSTEXPR +size_t +countof(const T (&)[N]) +{ + return N; +} + +template <typename T> +inline +_LIBCPP_CONSTEXPR +size_t +countof(const T * const begin, const T * const end) +{ + return static_cast<size_t>(end - begin); +} + } +const locale::category locale::none; +const locale::category locale::collate; +const locale::category locale::ctype; +const locale::category locale::monetary; +const locale::category locale::numeric; +const locale::category locale::time; +const locale::category locale::messages; +const locale::category locale::all; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" + class _LIBCPP_HIDDEN locale::__imp : public facet { enum {N = 28}; - string name_; vector<facet*, __sso_allocator<facet*, N> > facets_; + string name_; public: explicit __imp(size_t refs = 0); explicit __imp(const string& name, size_t refs = 0); @@ -108,7 +133,8 @@ public: ~__imp(); const string& name() const {return name_;} - bool has_facet(long id) const {return id < facets_.size() && facets_[id];} + bool has_facet(long id) const + {return static_cast<size_t>(id) < facets_.size() && facets_[static_cast<size_t>(id)];} const locale::facet* use_facet(long id) const; static const locale& make_classic(); @@ -119,46 +145,48 @@ private: template <class F> void install_from(const __imp& other); }; +#pragma clang diagnostic pop + locale::__imp::__imp(size_t refs) : facet(refs), - name_("C"), - facets_(N) + facets_(N), + name_("C") { facets_.clear(); - install(&make<_VSTD::collate<char> >(1)); - install(&make<_VSTD::collate<wchar_t> >(1)); - install(&make<_VSTD::ctype<char> >((ctype_base::mask*)0, false, 1)); - install(&make<_VSTD::ctype<wchar_t> >(1)); - install(&make<codecvt<char, char, mbstate_t> >(1)); - install(&make<codecvt<wchar_t, char, mbstate_t> >(1)); - install(&make<codecvt<char16_t, char, mbstate_t> >(1)); - install(&make<codecvt<char32_t, char, mbstate_t> >(1)); - install(&make<numpunct<char> >(1)); - install(&make<numpunct<wchar_t> >(1)); - install(&make<num_get<char> >(1)); - install(&make<num_get<wchar_t> >(1)); - install(&make<num_put<char> >(1)); - install(&make<num_put<wchar_t> >(1)); - install(&make<moneypunct<char, false> >(1)); - install(&make<moneypunct<char, true> >(1)); - install(&make<moneypunct<wchar_t, false> >(1)); - install(&make<moneypunct<wchar_t, true> >(1)); - install(&make<money_get<char> >(1)); - install(&make<money_get<wchar_t> >(1)); - install(&make<money_put<char> >(1)); - install(&make<money_put<wchar_t> >(1)); - install(&make<time_get<char> >(1)); - install(&make<time_get<wchar_t> >(1)); - install(&make<time_put<char> >(1)); - install(&make<time_put<wchar_t> >(1)); - install(&make<_VSTD::messages<char> >(1)); - install(&make<_VSTD::messages<wchar_t> >(1)); + install(&make<_VSTD::collate<char> >(1u)); + install(&make<_VSTD::collate<wchar_t> >(1u)); + install(&make<_VSTD::ctype<char> >((ctype_base::mask*)0, false, 1u)); + install(&make<_VSTD::ctype<wchar_t> >(1u)); + install(&make<codecvt<char, char, mbstate_t> >(1u)); + install(&make<codecvt<wchar_t, char, mbstate_t> >(1u)); + install(&make<codecvt<char16_t, char, mbstate_t> >(1u)); + install(&make<codecvt<char32_t, char, mbstate_t> >(1u)); + install(&make<numpunct<char> >(1u)); + install(&make<numpunct<wchar_t> >(1u)); + install(&make<num_get<char> >(1u)); + install(&make<num_get<wchar_t> >(1u)); + install(&make<num_put<char> >(1u)); + install(&make<num_put<wchar_t> >(1u)); + install(&make<moneypunct<char, false> >(1u)); + install(&make<moneypunct<char, true> >(1u)); + install(&make<moneypunct<wchar_t, false> >(1u)); + install(&make<moneypunct<wchar_t, true> >(1u)); + install(&make<money_get<char> >(1u)); + install(&make<money_get<wchar_t> >(1u)); + install(&make<money_put<char> >(1u)); + install(&make<money_put<wchar_t> >(1u)); + install(&make<time_get<char> >(1u)); + install(&make<time_get<wchar_t> >(1u)); + install(&make<time_put<char> >(1u)); + install(&make<time_put<wchar_t> >(1u)); + install(&make<_VSTD::messages<char> >(1u)); + install(&make<_VSTD::messages<wchar_t> >(1u)); } locale::__imp::__imp(const string& name, size_t refs) : facet(refs), - name_(name), - facets_(N) + facets_(N), + name_(name) { #ifndef _LIBCPP_NO_EXCEPTIONS try @@ -200,9 +228,14 @@ locale::__imp::__imp(const string& name, size_t refs) #endif // _LIBCPP_NO_EXCEPTIONS } +// NOTE avoid the `base class should be explicitly initialized in the +// copy constructor` warning emitted by GCC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wextra" + locale::__imp::__imp(const __imp& other) - : name_(other.name_), - facets_(max<size_t>(N, other.facets_.size())) + : facets_(max<size_t>(N, other.facets_.size())), + name_(other.name_) { facets_ = other.facets_; for (unsigned i = 0; i < facets_.size(); ++i) @@ -210,9 +243,11 @@ locale::__imp::__imp(const __imp& other) facets_[i]->__add_shared(); } +#pragma GCC diagnostic pop + locale::__imp::__imp(const __imp& other, const string& name, locale::category c) - : name_("*"), - facets_(N) + : facets_(N), + name_("*") { facets_ = other.facets_; for (unsigned i = 0; i < facets_.size(); ++i) @@ -282,8 +317,8 @@ locale::__imp::install_from(const locale::__imp& one) } locale::__imp::__imp(const __imp& other, const __imp& one, locale::category c) - : name_("*"), - facets_(N) + : facets_(N), + name_("*") { facets_ = other.facets_; for (unsigned i = 0; i < facets_.size(); ++i) @@ -352,8 +387,8 @@ locale::__imp::__imp(const __imp& other, const __imp& one, locale::category c) } locale::__imp::__imp(const __imp& other, facet* f, long id) - : name_("*"), - facets_(max<size_t>(N, other.facets_.size()+1)) + : facets_(max<size_t>(N, other.facets_.size()+1)), + name_("*") { f->__add_shared(); unique_ptr<facet, release> hold(f); @@ -376,11 +411,11 @@ locale::__imp::install(facet* f, long id) { f->__add_shared(); unique_ptr<facet, release> hold(f); - if (id >= facets_.size()) - facets_.resize(id+1); - if (facets_[id]) - facets_[id]->__release_shared(); - facets_[id] = hold.release(); + if (static_cast<size_t>(id) >= facets_.size()) + facets_.resize(static_cast<size_t>(id+1)); + if (facets_[static_cast<size_t>(id)]) + facets_[static_cast<size_t>(id)]->__release_shared(); + facets_[static_cast<size_t>(id)] = hold.release(); } const locale::facet* @@ -390,7 +425,7 @@ locale::__imp::use_facet(long id) const if (!has_facet(id)) throw bad_cast(); #endif // _LIBCPP_NO_EXCEPTIONS - return facets_[id]; + return facets_[static_cast<size_t>(id)]; } // locale @@ -401,7 +436,7 @@ locale::__imp::make_classic() // only one thread can get in here and it only gets in once static aligned_storage<sizeof(locale)>::type buf; locale* c = (locale*)&buf; - c->__locale_ = &make<__imp>(1); + c->__locale_ = &make<__imp>(1u); return *c; } @@ -417,7 +452,6 @@ locale::__imp::make_global() { // only one thread can get in here and it only gets in once static aligned_storage<sizeof(locale)>::type buf; - locale* g = (locale*)&buf; ::new (&buf) locale(locale::classic()); return *(locale*)&buf; } @@ -695,6 +729,19 @@ collate_byname<wchar_t>::do_transform(const char_type* lo, const char_type* hi) // template <> class ctype<wchar_t>; +const ctype_base::mask ctype_base::space; +const ctype_base::mask ctype_base::print; +const ctype_base::mask ctype_base::cntrl; +const ctype_base::mask ctype_base::upper; +const ctype_base::mask ctype_base::lower; +const ctype_base::mask ctype_base::alpha; +const ctype_base::mask ctype_base::digit; +const ctype_base::mask ctype_base::punct; +const ctype_base::mask ctype_base::xdigit; +const ctype_base::mask ctype_base::blank; +const ctype_base::mask ctype_base::alnum; +const ctype_base::mask ctype_base::graph; + locale::id ctype<wchar_t>::id; ctype<wchar_t>::~ctype() @@ -737,10 +784,12 @@ ctype<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high) wchar_t ctype<wchar_t>::do_toupper(char_type c) const { -#if !(defined(_LIBCPP_STABLE_APPLE_ABI) || defined(__FreeBSD__)) +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c; +#elif defined(__GLIBC__) || defined(EMSCRIPTEN) return isascii(c) ? ctype<char>::__classic_upper_table()[c] : c; #else - return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c; + return (isascii(c) && iswlower_l(c, __cloc())) ? c-L'a'+L'A' : c; #endif } @@ -748,11 +797,13 @@ const wchar_t* ctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const { for (; low != high; ++low) -#if !(defined(_LIBCPP_STABLE_APPLE_ABI) || defined(__FreeBSD__)) +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low; +#elif defined(__GLIBC__) || defined(EMSCRIPTEN) *low = isascii(*low) ? ctype<char>::__classic_upper_table()[*low] : *low; #else - *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low; + *low = (isascii(*low) && islower_l(*low, __cloc())) ? (*low-L'a'+L'A') : *low; #endif return low; } @@ -760,10 +811,12 @@ ctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const wchar_t ctype<wchar_t>::do_tolower(char_type c) const { -#ifndef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c; +#elif defined(__GLIBC__) || defined(EMSCRIPTEN) return isascii(c) ? ctype<char>::__classic_lower_table()[c] : c; #else - return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c; + return (isascii(c) && isupper_l(c, __cloc())) ? c-L'A'+'a' : c; #endif } @@ -771,11 +824,13 @@ const wchar_t* ctype<wchar_t>::do_tolower(char_type* low, const char_type* high) const { for (; low != high; ++low) -#ifndef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low; +#elif defined(__GLIBC__) || defined(EMSCRIPTEN) *low = isascii(*low) ? ctype<char>::__classic_lower_table()[*low] : *low; #else - *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low; + *low = (isascii(*low) && isupper_l(*low, __cloc())) ? *low-L'A'+L'a' : *low; #endif return low; } @@ -807,7 +862,7 @@ ctype<wchar_t>::do_narrow(const char_type* low, const char_type* high, char dfau { for (; low != high; ++low, ++dest) if (isascii(*low)) - *dest = *low; + *dest = static_cast<char>(*low); else *dest = dfault; return low; @@ -835,10 +890,14 @@ ctype<char>::~ctype() char ctype<char>::do_toupper(char_type c) const { -#ifndef _LIBCPP_STABLE_APPLE_ABI - return isascii(c) ? __classic_upper_table()[c] : c; +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + return isascii(c) ? + static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(c)]) : c; +#elif defined(__GLIBC__) || defined(EMSCRIPTEN) + return isascii(c) ? + static_cast<char>(__classic_upper_table()[static_cast<size_t>(c)]) : c; #else - return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c; + return (isascii(c) && islower_l(c, __cloc())) ? c-'a'+'A' : c; #endif } @@ -846,10 +905,14 @@ const char* ctype<char>::do_toupper(char_type* low, const char_type* high) const { for (; low != high; ++low) -#ifndef _LIBCPP_STABLE_APPLE_ABI - *low = isascii(*low) ? __classic_upper_table()[*low] : *low; +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + *low = isascii(*low) ? + static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(*low)]) : *low; +#elif defined(__GLIBC__) || defined(EMSCRIPTEN) + *low = isascii(*low) ? + static_cast<char>(__classic_upper_table()[static_cast<size_t>(*low)]) : *low; #else - *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low; + *low = (isascii(*low) && islower_l(*low, __cloc())) ? *low-'a'+'A' : *low; #endif return low; } @@ -857,10 +920,14 @@ ctype<char>::do_toupper(char_type* low, const char_type* high) const char ctype<char>::do_tolower(char_type c) const { -#ifndef _LIBCPP_STABLE_APPLE_ABI - return isascii(c) ? __classic_lower_table()[c] : c; +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + return isascii(c) ? + static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(c)]) : c; +#elif defined(__GLIBC__) || defined(EMSCRIPTEN) + return isascii(c) ? + static_cast<char>(__classic_lower_table()[static_cast<size_t>(c)]) : c; #else - return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c; + return (isascii(c) && isupper_l(c, __cloc())) ? c-'A'+'a' : c; #endif } @@ -868,10 +935,12 @@ const char* ctype<char>::do_tolower(char_type* low, const char_type* high) const { for (; low != high; ++low) -#ifndef _LIBCPP_STABLE_APPLE_ABI - *low = isascii(*low) ? __classic_lower_table()[*low] : *low; +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + *low = isascii(*low) ? static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(*low)]) : *low; +#elif defined(__GLIBC__) || defined(EMSCRIPTEN) + *low = isascii(*low) ? static_cast<char>(__classic_lower_table()[static_cast<size_t>(*low)]) : *low; #else - *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low; + *low = (isascii(*low) && isupper_l(*low, __cloc())) ? *low-'A'+'a' : *low; #endif return low; } @@ -909,10 +978,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault, return low; } -// XXX Emscripten define local table +#ifdef EMSCRIPTEN extern "C" const unsigned short ** __ctype_b_loc(); extern "C" const int ** __ctype_tolower_loc(); extern "C" const int ** __ctype_toupper_loc(); +#endif const ctype<char>::mask* ctype<char>::classic_table() _NOEXCEPT @@ -921,44 +991,50 @@ ctype<char>::classic_table() _NOEXCEPT return _DefaultRuneLocale.__runetype; #elif defined(__GLIBC__) return __cloc()->__ctype_b; +#elif __sun__ + return __ctype_mask; +#elif defined(_WIN32) + return _ctype+1; // internal ctype mask table defined in msvcrt.dll // This is assumed to be safe, which is a nonsense assumption because we're // going to end up dereferencing it later... #elif defined(EMSCRIPTEN) return *__ctype_b_loc(); #else + // Platform not supported: abort so the person doing the port knows what to + // fix +# warning ctype<char>::classic_table() is not implemented + abort(); return NULL; #endif } -#ifndef _LIBCPP_STABLE_APPLE_ABI +#if defined(__GLIBC__) const int* ctype<char>::__classic_lower_table() _NOEXCEPT { -#if defined(__APPLE__) || defined(__FreeBSD__) - return _DefaultRuneLocale.__maplower; -#elif defined(__GLIBC__) return __cloc()->__ctype_tolower; -#elif defined(EMSCRIPTEN) - return *__ctype_tolower_loc(); -#else - return NULL; -#endif } const int* ctype<char>::__classic_upper_table() _NOEXCEPT { -#if defined(__APPLE__) || defined(__FreeBSD__) - return _DefaultRuneLocale.__mapupper; -#elif defined(__GLIBC__) return __cloc()->__ctype_toupper; -#elif defined(EMSCRIPTEN) +} +#endif // __GLIBC__ + +#if defined(EMSCRIPTEN) +const int* +ctype<char>::__classic_lower_table() _NOEXCEPT +{ + return *__ctype_tolower_loc(); +} + +const int* +ctype<char>::__classic_upper_table() _NOEXCEPT +{ return *__ctype_toupper_loc(); -#else - return NULL; -#endif } -#endif // _LIBCPP_STABLE_APPLE_ABI +#endif // EMSCRIPTEN // template <> class ctype_byname<char> @@ -992,28 +1068,28 @@ ctype_byname<char>::~ctype_byname() char ctype_byname<char>::do_toupper(char_type c) const { - return toupper_l(c, __l); + return static_cast<char>(toupper_l(c, __l)); } const char* ctype_byname<char>::do_toupper(char_type* low, const char_type* high) const { for (; low != high; ++low) - *low = toupper_l(*low, __l); + *low = static_cast<char>(toupper_l(*low, __l)); return low; } char ctype_byname<char>::do_tolower(char_type c) const { - return tolower_l(c, __l); + return static_cast<char>(tolower_l(c, __l)); } const char* ctype_byname<char>::do_tolower(char_type* low, const char_type* high) const { for (; low != high; ++low) - *low = tolower_l(*low, __l); + *low = static_cast<char>(tolower_l(*low, __l)); return low; } @@ -1052,18 +1128,19 @@ ctype_byname<wchar_t>::do_is(mask m, char_type c) const #ifdef _LIBCPP_WCTYPE_IS_MASK return static_cast<bool>(iswctype_l(c, m, __l)); #else - // FIXME: This is broken for things that test more than one flag. - if (m & space && !iswspace_l(c, __l)) return false; - if (m & print && !iswprint_l(c, __l)) return false; - if (m & cntrl && !iswcntrl_l(c, __l)) return false; - if (m & upper && !iswupper_l(c, __l)) return false; - if (m & lower && !iswlower_l(c, __l)) return false; - if (m & alpha && !iswalpha_l(c, __l)) return false; - if (m & digit && !iswdigit_l(c, __l)) return false; - if (m & punct && !iswpunct_l(c, __l)) return false; - if (m & xdigit && !iswxdigit_l(c, __l)) return false; - if (m & blank && !iswblank_l(c, __l)) return false; - return true; + bool result = false; + wint_t ch = static_cast<wint_t>(c); + if (m & space) result |= (iswspace_l(ch, __l) != 0); + if (m & print) result |= (iswprint_l(ch, __l) != 0); + if (m & cntrl) result |= (iswcntrl_l(ch, __l) != 0); + if (m & upper) result |= (iswupper_l(ch, __l) != 0); + if (m & lower) result |= (iswlower_l(ch, __l) != 0); + if (m & alpha) result |= (iswalpha_l(ch, __l) != 0); + if (m & digit) result |= (iswdigit_l(ch, __l) != 0); + if (m & punct) result |= (iswpunct_l(ch, __l) != 0); + if (m & xdigit) result |= (iswxdigit_l(ch, __l) != 0); + if (m & blank) result |= (iswblank_l(ch, __l) != 0); + return result; #endif } @@ -1077,23 +1154,24 @@ ctype_byname<wchar_t>::do_is(const char_type* low, const char_type* high, mask* else { *vec = 0; - if (iswspace_l(*low, __l)) + wint_t ch = static_cast<wint_t>(*low); + if (iswspace_l(ch, __l)) *vec |= space; - if (iswprint_l(*low, __l)) + if (iswprint_l(ch, __l)) *vec |= print; - if (iswcntrl_l(*low, __l)) + if (iswcntrl_l(ch, __l)) *vec |= cntrl; - if (iswupper_l(*low, __l)) + if (iswupper_l(ch, __l)) *vec |= upper; - if (iswlower_l(*low, __l)) + if (iswlower_l(ch, __l)) *vec |= lower; - if (iswalpha_l(*low, __l)) + if (iswalpha_l(ch, __l)) *vec |= alpha; - if (iswdigit_l(*low, __l)) + if (iswdigit_l(ch, __l)) *vec |= digit; - if (iswpunct_l(*low, __l)) + if (iswpunct_l(ch, __l)) *vec |= punct; - if (iswxdigit_l(*low, __l)) + if (iswxdigit_l(ch, __l)) *vec |= xdigit; } } @@ -1109,17 +1187,17 @@ ctype_byname<wchar_t>::do_scan_is(mask m, const char_type* low, const char_type* if (iswctype_l(*low, m, __l)) break; #else - if (m & space && !iswspace_l(*low, __l)) continue; - if (m & print && !iswprint_l(*low, __l)) continue; - if (m & cntrl && !iswcntrl_l(*low, __l)) continue; - if (m & upper && !iswupper_l(*low, __l)) continue; - if (m & lower && !iswlower_l(*low, __l)) continue; - if (m & alpha && !iswalpha_l(*low, __l)) continue; - if (m & digit && !iswdigit_l(*low, __l)) continue; - if (m & punct && !iswpunct_l(*low, __l)) continue; - if (m & xdigit && !iswxdigit_l(*low, __l)) continue; - if (m & blank && !iswblank_l(*low, __l)) continue; - break; + wint_t ch = static_cast<wint_t>(*low); + if (m & space && iswspace_l(ch, __l)) break; + if (m & print && iswprint_l(ch, __l)) break; + if (m & cntrl && iswcntrl_l(ch, __l)) break; + if (m & upper && iswupper_l(ch, __l)) break; + if (m & lower && iswlower_l(ch, __l)) break; + if (m & alpha && iswalpha_l(ch, __l)) break; + if (m & digit && iswdigit_l(ch, __l)) break; + if (m & punct && iswpunct_l(ch, __l)) break; + if (m & xdigit && iswxdigit_l(ch, __l)) break; + if (m & blank && iswblank_l(ch, __l)) break; #endif } return low; @@ -1134,16 +1212,17 @@ ctype_byname<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type if (!iswctype_l(*low, m, __l)) break; #else - if (m & space && iswspace_l(*low, __l)) continue; - if (m & print && iswprint_l(*low, __l)) continue; - if (m & cntrl && iswcntrl_l(*low, __l)) continue; - if (m & upper && iswupper_l(*low, __l)) continue; - if (m & lower && iswlower_l(*low, __l)) continue; - if (m & alpha && iswalpha_l(*low, __l)) continue; - if (m & digit && iswdigit_l(*low, __l)) continue; - if (m & punct && iswpunct_l(*low, __l)) continue; - if (m & xdigit && iswxdigit_l(*low, __l)) continue; - if (m & blank && iswblank_l(*low, __l)) continue; + wint_t ch = static_cast<wint_t>(*low); + if (m & space && iswspace_l(ch, __l)) continue; + if (m & print && iswprint_l(ch, __l)) continue; + if (m & cntrl && iswcntrl_l(ch, __l)) continue; + if (m & upper && iswupper_l(ch, __l)) continue; + if (m & lower && iswlower_l(ch, __l)) continue; + if (m & alpha && iswalpha_l(ch, __l)) continue; + if (m & digit && iswdigit_l(ch, __l)) continue; + if (m & punct && iswpunct_l(ch, __l)) continue; + if (m & xdigit && iswxdigit_l(ch, __l)) continue; + if (m & blank && iswblank_l(ch, __l)) continue; break; #endif } @@ -1181,7 +1260,7 @@ ctype_byname<wchar_t>::do_tolower(char_type* low, const char_type* high) const wchar_t ctype_byname<wchar_t>::do_widen(char c) const { -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS return btowc_l(c, __l); #else return __btowc_l(c, __l); @@ -1192,7 +1271,7 @@ const char* ctype_byname<wchar_t>::do_widen(const char* low, const char* high, char_type* dest) const { for (; low != high; ++low, ++dest) -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS *dest = btowc_l(*low, __l); #else *dest = __btowc_l(*low, __l); @@ -1203,12 +1282,12 @@ ctype_byname<wchar_t>::do_widen(const char* low, const char* high, char_type* de char ctype_byname<wchar_t>::do_narrow(char_type c, char dfault) const { -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS int r = wctob_l(c, __l); #else int r = __wctob_l(c, __l); #endif - return r != WEOF ? static_cast<char>(r) : dfault; + return r != static_cast<int>(WEOF) ? static_cast<char>(r) : dfault; } const wchar_t* @@ -1216,12 +1295,12 @@ ctype_byname<wchar_t>::do_narrow(const char_type* low, const char_type* high, ch { for (; low != high; ++low, ++dest) { -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS int r = wctob_l(*low, __l); #else int r = __wctob_l(*low, __l); #endif - *dest = r != WEOF ? static_cast<char>(r) : dfault; + *dest = r != static_cast<int>(WEOF) ? static_cast<char>(r) : dfault; } return low; } @@ -1278,7 +1357,7 @@ int codecvt<char, char, mbstate_t>::do_length(state_type&, const extern_type* frm, const extern_type* end, size_t mx) const { - return static_cast<int>(min<size_t>(mx, end-frm)); + return static_cast<int>(min<size_t>(mx, static_cast<size_t>(end-frm))); } int @@ -1330,8 +1409,9 @@ codecvt<wchar_t, char, mbstate_t>::do_out(state_type& st, { // save state in case needed to reover to_nxt on error mbstate_t save_state = st; -#ifdef _LIBCPP_STABLE_APPLE_ABI - size_t n = wcsnrtombs_l(to, &frm_nxt, fend-frm, to_end-to, &st, __l); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t n = wcsnrtombs_l(to, &frm_nxt, static_cast<size_t>(fend-frm), + static_cast<size_t>(to_end-to), &st, __l); #else size_t n = __wcsnrtombs_l(to, &frm_nxt, fend-frm, to_end-to, &st, __l); #endif @@ -1340,7 +1420,7 @@ codecvt<wchar_t, char, mbstate_t>::do_out(state_type& st, // need to recover to_nxt for (to_nxt = to; frm != frm_nxt; ++frm) { -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS n = wcrtomb_l(to_nxt, *frm, &save_state, __l); #else n = __wcrtomb_l(to_nxt, *frm, &save_state, __l); @@ -1361,14 +1441,14 @@ codecvt<wchar_t, char, mbstate_t>::do_out(state_type& st, { // Try to write the terminating null extern_type tmp[MB_LEN_MAX]; -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS n = wcrtomb_l(tmp, intern_type(), &st, __l); #else n = __wcrtomb_l(tmp, intern_type(), &st, __l); #endif if (n == size_t(-1)) // on error return error; - if (n > to_end-to_nxt) // is there room? + if (n > static_cast<size_t>(to_end-to_nxt)) // is there room? return partial; for (extern_type* p = tmp; n; --n) // write it *to_nxt++ = *p++; @@ -1398,8 +1478,9 @@ codecvt<wchar_t, char, mbstate_t>::do_in(state_type& st, { // save state in case needed to reover to_nxt on error mbstate_t save_state = st; -#ifdef _LIBCPP_STABLE_APPLE_ABI - size_t n = mbsnrtowcs_l(to, &frm_nxt, fend-frm, to_end-to, &st, __l); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t n = mbsnrtowcs_l(to, &frm_nxt, static_cast<size_t>(fend-frm), + static_cast<size_t>(to_end-to), &st, __l); #else size_t n = __mbsnrtowcs_l(to, &frm_nxt, fend-frm, to_end-to, &st, __l); #endif @@ -1408,8 +1489,9 @@ codecvt<wchar_t, char, mbstate_t>::do_in(state_type& st, // need to recover to_nxt for (to_nxt = to; frm != frm_nxt; ++to_nxt) { -#ifdef _LIBCPP_STABLE_APPLE_ABI - n = mbrtowc_l(to_nxt, frm, fend-frm, &save_state, __l); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + n = mbrtowc_l(to_nxt, frm, static_cast<size_t>(fend-frm), + &save_state, __l); #else n = __mbrtowc_l(to_nxt, frm, fend-frm, &save_state, __l); #endif @@ -1418,10 +1500,10 @@ codecvt<wchar_t, char, mbstate_t>::do_in(state_type& st, case 0: ++frm; break; - case static_cast<size_t>(-1): // XXX EMSCRIPTEN + case size_t(-1): frm_nxt = frm; return error; - case static_cast<size_t>(-2): // XXX EMSCRIPTEN + case size_t(-2): frm_nxt = frm; return partial; default: @@ -1440,7 +1522,7 @@ codecvt<wchar_t, char, mbstate_t>::do_in(state_type& st, if (fend != frm_end) // set up next null terminated sequence { // Try to write the terminating null -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS n = mbrtowc_l(to_nxt, frm_nxt, 1, &st, __l); #else n = __mbrtowc_l(to_nxt, frm_nxt, 1, &st, __l); @@ -1464,7 +1546,7 @@ codecvt<wchar_t, char, mbstate_t>::do_unshift(state_type& st, { to_nxt = to; extern_type tmp[MB_LEN_MAX]; -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS size_t n = wcrtomb_l(tmp, intern_type(), &st, __l); #else size_t n = __wcrtomb_l(tmp, intern_type(), &st, __l); @@ -1472,7 +1554,7 @@ codecvt<wchar_t, char, mbstate_t>::do_unshift(state_type& st, if (n == size_t(-1) || n == 0) // on error return error; --n; - if (n > to_end-to_nxt) // is there room? + if (n > static_cast<size_t>(to_end-to_nxt)) // is there room? return partial; for (extern_type* p = tmp; n; --n) // write it *to_nxt++ = *p++; @@ -1482,14 +1564,14 @@ codecvt<wchar_t, char, mbstate_t>::do_unshift(state_type& st, int codecvt<wchar_t, char, mbstate_t>::do_encoding() const _NOEXCEPT { -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS if (mbtowc_l((wchar_t*) 0, (const char*) 0, MB_LEN_MAX, __l) == 0) #else if (__mbtowc_l((wchar_t*) 0, (const char*) 0, MB_LEN_MAX, __l) == 0) #endif { // stateless encoding -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS if (__l == 0 || MB_CUR_MAX_L(__l) == 1) // there are no known constant length encodings #else if (__l == 0 || __mb_cur_max_l(__l) == 1) // there are no known constant length encodings @@ -1513,8 +1595,8 @@ codecvt<wchar_t, char, mbstate_t>::do_length(state_type& st, int nbytes = 0; for (size_t nwchar_t = 0; nwchar_t < mx && frm != frm_end; ++nwchar_t) { -#ifdef _LIBCPP_STABLE_APPLE_ABI - size_t n = mbrlen_l(frm, frm_end-frm, &st, __l); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t n = mbrlen_l(frm, static_cast<size_t>(frm_end-frm), &st, __l); #else size_t n = __mbrlen_l(frm, frm_end-frm, &st, __l); #endif @@ -1524,8 +1606,8 @@ codecvt<wchar_t, char, mbstate_t>::do_length(state_type& st, ++nbytes; ++frm; break; - case static_cast<size_t>(-1): // XXX EMSCRIPTEN - case static_cast<size_t>(-2): // XXX EMSCRIPTEN + case size_t(-1): + case size_t(-2): return nbytes; default: nbytes += n; @@ -1539,10 +1621,10 @@ codecvt<wchar_t, char, mbstate_t>::do_length(state_type& st, int codecvt<wchar_t, char, mbstate_t>::do_max_length() const _NOEXCEPT { -#ifdef _LIBCPP_STABLE_APPLE_ABI - return __l == 0 ? 1 : MB_CUR_MAX_L(__l); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return __l == 0 ? 1 : static_cast<int>( MB_CUR_MAX_L(__l)); #else - return __l == 0 ? 1 : __mb_cur_max_l(__l); + return __l == 0 ? 1 : static_cast<int>(__mb_cur_max_l(__l)); #endif } @@ -1997,9 +2079,6 @@ utf8_to_utf16_length(const uint8_t* frm, const uint8_t* frm_end, break; uint8_t c2 = frm_nxt[1]; uint8_t c3 = frm_nxt[2]; - uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12) - | ((c2 & 0x3F) << 6) - | (c3 & 0x3F)); switch (c1) { case 0xE0: @@ -2017,7 +2096,7 @@ utf8_to_utf16_length(const uint8_t* frm, const uint8_t* frm_end, } if ((c3 & 0xC0) != 0x80) break; - if ((((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6) | (c3 & 0x3F)) > Maxcode) + if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode) break; frm_nxt += 3; } @@ -2259,7 +2338,7 @@ utf8_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end, { if ((frm_end-frm_nxt < 2) || ((frm_nxt[1] & 0xC0) != 0x80)) break; - if ((((c1 & 0x1F) << 6) | (frm_nxt[1] & 0x3F)) > Maxcode) + if ((((c1 & 0x1Fu) << 6) | (frm_nxt[1] & 0x3Fu)) > Maxcode) break; frm_nxt += 2; } @@ -2286,7 +2365,7 @@ utf8_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end, } if ((c3 & 0xC0) != 0x80) break; - if ((((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6) | (c3 & 0x3F)) > Maxcode) + if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode) break; frm_nxt += 3; } @@ -2314,12 +2393,8 @@ utf8_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end, } if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80) break; - uint32_t t = static_cast<uint32_t>(((c1 & 0x07) << 18) - | ((c2 & 0x3F) << 12) - | ((c3 & 0x3F) << 6) - | (c4 & 0x3F)); - if ((((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) | - ((c3 & 0x3F) << 6) | (c4 & 0x3F)) > Maxcode) + if ((((c1 & 0x07u) << 18) | ((c2 & 0x3Fu) << 12) | + ((c3 & 0x3Fu) << 6) | (c4 & 0x3Fu)) > Maxcode) break; frm_nxt += 4; } @@ -2488,7 +2563,7 @@ utf8_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end, { if ((frm_end-frm_nxt < 2) || ((frm_nxt[1] & 0xC0) != 0x80)) break; - if ((((c1 & 0x1F) << 6) | (frm_nxt[1] & 0x3F)) > Maxcode) + if ((((c1 & 0x1Fu) << 6) | (frm_nxt[1] & 0x3Fu)) > Maxcode) break; frm_nxt += 2; } @@ -2515,7 +2590,7 @@ utf8_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end, } if ((c3 & 0xC0) != 0x80) break; - if ((((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6) | (c3 & 0x3F)) > Maxcode) + if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode) break; frm_nxt += 3; } @@ -2587,7 +2662,7 @@ utf16be_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_ } for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt) { - uint16_t c1 = frm_nxt[0] << 8 | frm_nxt[1]; + uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]); if ((c1 & 0xFC00) == 0xDC00) return codecvt_base::error; if ((c1 & 0xFC00) != 0xD800) @@ -2601,7 +2676,7 @@ utf16be_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_ { if (frm_end-frm_nxt < 4) return codecvt_base::partial; - uint16_t c2 = frm_nxt[2] << 8 | frm_nxt[3]; + uint16_t c2 = static_cast<uint16_t>(frm_nxt[2] << 8 | frm_nxt[3]); if ((c2 & 0xFC00) != 0xDC00) return codecvt_base::error; uint32_t t = static_cast<uint32_t>( @@ -2624,7 +2699,6 @@ utf16be_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end, codecvt_mode mode = codecvt_mode(0)) { const uint8_t* frm_nxt = frm; - frm_nxt = frm; if (mode & consume_header) { if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF) @@ -2632,7 +2706,7 @@ utf16be_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end, } for (size_t nchar32_t = 0; frm_nxt < frm_end - 1 && nchar32_t < mx; ++nchar32_t) { - uint16_t c1 = frm_nxt[0] << 8 | frm_nxt[1]; + uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]); if ((c1 & 0xFC00) == 0xDC00) break; if ((c1 & 0xFC00) != 0xD800) @@ -2645,7 +2719,7 @@ utf16be_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end, { if (frm_end-frm_nxt < 4) break; - uint16_t c2 = frm_nxt[2] << 8 | frm_nxt[3]; + uint16_t c2 = static_cast<uint16_t>(frm_nxt[2] << 8 | frm_nxt[3]); if ((c2 & 0xFC00) != 0xDC00) break; uint32_t t = static_cast<uint32_t>( @@ -2720,7 +2794,7 @@ utf16le_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_ } for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt) { - uint16_t c1 = frm_nxt[1] << 8 | frm_nxt[0]; + uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]); if ((c1 & 0xFC00) == 0xDC00) return codecvt_base::error; if ((c1 & 0xFC00) != 0xD800) @@ -2734,7 +2808,7 @@ utf16le_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_ { if (frm_end-frm_nxt < 4) return codecvt_base::partial; - uint16_t c2 = frm_nxt[3] << 8 | frm_nxt[2]; + uint16_t c2 = static_cast<uint16_t>(frm_nxt[3] << 8 | frm_nxt[2]); if ((c2 & 0xFC00) != 0xDC00) return codecvt_base::error; uint32_t t = static_cast<uint32_t>( @@ -2757,7 +2831,6 @@ utf16le_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end, codecvt_mode mode = codecvt_mode(0)) { const uint8_t* frm_nxt = frm; - frm_nxt = frm; if (mode & consume_header) { if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE) @@ -2765,7 +2838,7 @@ utf16le_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end, } for (size_t nchar32_t = 0; frm_nxt < frm_end - 1 && nchar32_t < mx; ++nchar32_t) { - uint16_t c1 = frm_nxt[1] << 8 | frm_nxt[0]; + uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]); if ((c1 & 0xFC00) == 0xDC00) break; if ((c1 & 0xFC00) != 0xD800) @@ -2778,7 +2851,7 @@ utf16le_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end, { if (frm_end-frm_nxt < 4) break; - uint16_t c2 = frm_nxt[3] << 8 | frm_nxt[2]; + uint16_t c2 = static_cast<uint16_t>(frm_nxt[3] << 8 | frm_nxt[2]); if ((c2 & 0xFC00) != 0xDC00) break; uint32_t t = static_cast<uint32_t>( @@ -2836,7 +2909,7 @@ utf16be_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_ } for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt) { - uint16_t c1 = frm_nxt[0] << 8 | frm_nxt[1]; + uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]); if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode) return codecvt_base::error; *to_nxt = c1; @@ -2852,7 +2925,6 @@ utf16be_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end, codecvt_mode mode = codecvt_mode(0)) { const uint8_t* frm_nxt = frm; - frm_nxt = frm; if (mode & consume_header) { if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF) @@ -2860,7 +2932,7 @@ utf16be_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end, } for (size_t nchar16_t = 0; frm_nxt < frm_end - 1 && nchar16_t < mx; ++nchar16_t) { - uint16_t c1 = frm_nxt[0] << 8 | frm_nxt[1]; + uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]); if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode) break; frm_nxt += 2; @@ -2911,7 +2983,7 @@ utf16le_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_ } for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt) { - uint16_t c1 = frm_nxt[1] << 8 | frm_nxt[0]; + uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]); if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode) return codecvt_base::error; *to_nxt = c1; @@ -2935,7 +3007,7 @@ utf16le_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end, } for (size_t nchar16_t = 0; frm_nxt < frm_end - 1 && nchar16_t < mx; ++nchar16_t) { - uint16_t c1 = frm_nxt[1] << 8 | frm_nxt[0]; + uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]); if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode) break; frm_nxt += 2; @@ -4088,11 +4160,11 @@ numpunct_byname<char>::__init(const char* nm) { __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); #ifndef _LIBCPP_NO_EXCEPTIONS - if (loc == 0) + if (loc == nullptr) throw runtime_error("numpunct_byname<char>::numpunct_byname" " failed to construct for " + string(nm)); #endif // _LIBCPP_NO_EXCEPTIONS -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS lconv* lc = localeconv_l(loc.get()); #else lconv* lc = __localeconv_l(loc.get()); @@ -4131,11 +4203,11 @@ numpunct_byname<wchar_t>::__init(const char* nm) { __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); #ifndef _LIBCPP_NO_EXCEPTIONS - if (loc == 0) + if (loc == nullptr) throw runtime_error("numpunct_byname<char>::numpunct_byname" " failed to construct for " + string(nm)); #endif // _LIBCPP_NO_EXCEPTIONS -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS lconv* lc = localeconv_l(loc.get()); #else lconv* lc = __localeconv_l(loc.get()); @@ -4179,7 +4251,7 @@ __check_grouping(const string& __grouping, unsigned* __g, unsigned* __g_end, { if (0 < *__ig && *__ig < numeric_limits<char>::max()) { - if (*__ig != *__r) + if (static_cast<unsigned>(*__ig) != *__r) { __err = ios_base::failbit; return; @@ -4190,7 +4262,7 @@ __check_grouping(const string& __grouping, unsigned* __g, unsigned* __g_end, } if (0 < *__ig && *__ig < numeric_limits<char>::max()) { - if (*__ig < __g_end[-1] || __g_end[-1] == 0) + if (static_cast<unsigned>(*__ig) < __g_end[-1] || __g_end[-1] == 0) __err = ios_base::failbit; } } @@ -4563,11 +4635,14 @@ __time_get::~__time_get() freelocale(__loc_); } +#pragma clang diagnostic ignored "-Wmissing-field-initializers" +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" + template <> string __time_get_storage<char>::__analyze(char fmt, const ctype<char>& ct) { - tm t; + tm t = {0}; t.tm_sec = 59; t.tm_min = 55; t.tm_hour = 23; @@ -4581,7 +4656,7 @@ __time_get_storage<char>::__analyze(char fmt, const ctype<char>& ct) char f[3] = {0}; f[0] = '%'; f[1] = fmt; - size_t n = strftime_l(buf, 100, f, &t, __loc_); + size_t n = strftime_l(buf, countof(buf), f, &t, __loc_); char* bb = buf; char* be = buf + n; string result; @@ -4596,7 +4671,7 @@ __time_get_storage<char>::__analyze(char fmt, const ctype<char>& ct) } char* w = bb; ios_base::iostate err = ios_base::goodbit; - int i = __scan_keyword(w, be, this->__weeks_, this->__weeks_+14, + ptrdiff_t i = __scan_keyword(w, be, this->__weeks_, this->__weeks_+14, ct, err, false) - this->__weeks_; if (i < 14) @@ -4707,11 +4782,13 @@ __time_get_storage<char>::__analyze(char fmt, const ctype<char>& ct) return result; } +#pragma clang diagnostic ignored "-Wmissing-braces" + template <> wstring __time_get_storage<wchar_t>::__analyze(char fmt, const ctype<wchar_t>& ct) { - tm t; + tm t = {0}; t.tm_sec = 59; t.tm_min = 55; t.tm_hour = 23; @@ -4725,19 +4802,19 @@ __time_get_storage<wchar_t>::__analyze(char fmt, const ctype<wchar_t>& ct) char f[3] = {0}; f[0] = '%'; f[1] = fmt; - size_t be = strftime_l(buf, 100, f, &t, __loc_); + strftime_l(buf, countof(buf), f, &t, __loc_); wchar_t wbuf[100]; wchar_t* wbb = wbuf; mbstate_t mb = {0}; const char* bb = buf; -#ifdef _LIBCPP_STABLE_APPLE_ABI - size_t i = mbsrtowcs_l( wbb, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l( wbb, &bb, countof(wbuf), &mb, __loc_); #else - size_t i = __mbsrtowcs_l( wbb, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); + size_t j = __mbsrtowcs_l( wbb, &bb, countof(wbuf), &mb, __loc_); #endif - if (i == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); - wchar_t* wbe = wbb + i; + wchar_t* wbe = wbb + j; wstring result; while (wbb != wbe) { @@ -4750,7 +4827,7 @@ __time_get_storage<wchar_t>::__analyze(char fmt, const ctype<wchar_t>& ct) } wchar_t* w = wbb; ios_base::iostate err = ios_base::goodbit; - int i = __scan_keyword(w, wbe, this->__weeks_, this->__weeks_+14, + ptrdiff_t i = __scan_keyword(w, wbe, this->__weeks_, this->__weeks_+14, ct, err, false) - this->__weeks_; if (i < 14) @@ -4865,32 +4942,32 @@ template <> void __time_get_storage<char>::init(const ctype<char>& ct) { - tm t; + tm t = {0}; char buf[100]; // __weeks_ for (int i = 0; i < 7; ++i) { t.tm_wday = i; - strftime_l(buf, 100, "%A", &t, __loc_); + strftime_l(buf, countof(buf), "%A", &t, __loc_); __weeks_[i] = buf; - strftime_l(buf, 100, "%a", &t, __loc_); + strftime_l(buf, countof(buf), "%a", &t, __loc_); __weeks_[i+7] = buf; } // __months_ for (int i = 0; i < 12; ++i) { t.tm_mon = i; - strftime_l(buf, 100, "%B", &t, __loc_); + strftime_l(buf, countof(buf), "%B", &t, __loc_); __months_[i] = buf; - strftime_l(buf, 100, "%b", &t, __loc_); + strftime_l(buf, countof(buf), "%b", &t, __loc_); __months_[i+12] = buf; } // __am_pm_ t.tm_hour = 1; - strftime_l(buf, 100, "%p", &t, __loc_); + strftime_l(buf, countof(buf), "%p", &t, __loc_); __am_pm_[0] = buf; t.tm_hour = 13; - strftime_l(buf, 100, "%p", &t, __loc_); + strftime_l(buf, countof(buf), "%p", &t, __loc_); __am_pm_[1] = buf; __c_ = __analyze('c', ct); __r_ = __analyze('r', ct); @@ -4904,7 +4981,6 @@ __time_get_storage<wchar_t>::init(const ctype<wchar_t>& ct) { tm t = {0}; char buf[100]; - size_t be; wchar_t wbuf[100]; wchar_t* wbe; mbstate_t mb = {0}; @@ -4912,27 +4988,27 @@ __time_get_storage<wchar_t>::init(const ctype<wchar_t>& ct) for (int i = 0; i < 7; ++i) { t.tm_wday = i; - be = strftime_l(buf, 100, "%A", &t, __loc_); + strftime_l(buf, countof(buf), "%A", &t, __loc_); mb = mbstate_t(); const char* bb = buf; -#ifdef _LIBCPP_STABLE_APPLE_ABI - size_t j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_); #else - size_t j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); + size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_); #endif - if (j == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); wbe = wbuf + j; __weeks_[i].assign(wbuf, wbe); - be = strftime_l(buf, 100, "%a", &t, __loc_); + strftime_l(buf, countof(buf), "%a", &t, __loc_); mb = mbstate_t(); bb = buf; -#ifdef _LIBCPP_STABLE_APPLE_ABI - j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_); #else - j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); + j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_); #endif - if (j == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); wbe = wbuf + j; __weeks_[i+7].assign(wbuf, wbe); @@ -4941,55 +5017,55 @@ __time_get_storage<wchar_t>::init(const ctype<wchar_t>& ct) for (int i = 0; i < 12; ++i) { t.tm_mon = i; - be = strftime_l(buf, 100, "%B", &t, __loc_); + strftime_l(buf, countof(buf), "%B", &t, __loc_); mb = mbstate_t(); const char* bb = buf; -#ifdef _LIBCPP_STABLE_APPLE_ABI - size_t j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_); #else - size_t j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); + size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_); #endif - if (j == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); wbe = wbuf + j; __months_[i].assign(wbuf, wbe); - be = strftime_l(buf, 100, "%b", &t, __loc_); + strftime_l(buf, countof(buf), "%b", &t, __loc_); mb = mbstate_t(); bb = buf; -#ifdef _LIBCPP_STABLE_APPLE_ABI - j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_); #else - j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); + j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_); #endif - if (j == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); wbe = wbuf + j; __months_[i+12].assign(wbuf, wbe); } // __am_pm_ t.tm_hour = 1; - be = strftime_l(buf, 100, "%p", &t, __loc_); + strftime_l(buf, countof(buf), "%p", &t, __loc_); mb = mbstate_t(); const char* bb = buf; -#ifdef _LIBCPP_STABLE_APPLE_ABI - size_t j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_); #else - size_t j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); + size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_); #endif - if (j == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); wbe = wbuf + j; __am_pm_[0].assign(wbuf, wbe); t.tm_hour = 13; - be = strftime_l(buf, 100, "%p", &t, __loc_); + strftime_l(buf, countof(buf), "%p", &t, __loc_); mb = mbstate_t(); bb = buf; -#ifdef _LIBCPP_STABLE_APPLE_ABI - j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_); #else - j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); + j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_); #endif - if (j == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); wbe = wbuf + j; __am_pm_[1].assign(wbuf, wbe); @@ -5250,7 +5326,7 @@ __time_put::__do_put(char* __nb, char*& __ne, const tm* __tm, char fmt[] = {'%', __fmt, __mod, 0}; if (__mod != 0) swap(fmt[1], fmt[2]); - size_t n = strftime_l(__nb, __ne-__nb, fmt, __tm, __loc_); + size_t n = strftime_l(__nb, countof(__nb, __ne), fmt, __tm, __loc_); __ne = __nb + n; } @@ -5263,128 +5339,212 @@ __time_put::__do_put(wchar_t* __wb, wchar_t*& __we, const tm* __tm, __do_put(__nar, __ne, __tm, __fmt, __mod); mbstate_t mb = {0}; const char* __nb = __nar; -#ifdef _LIBCPP_STABLE_APPLE_ABI - size_t j = mbsrtowcs_l(__wb, &__nb, 100, &mb, __loc_); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l(__wb, &__nb, countof(__wb, __we), &mb, __loc_); #else - size_t j = __mbsrtowcs_l(__wb, &__nb, 100, &mb, __loc_); + size_t j = __mbsrtowcs_l(__wb, &__nb, countof(__wb, __we), &mb, __loc_); #endif - if (j == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); __we = __wb + j; } // moneypunct_byname +template <class charT> static void -__init_pat(money_base::pattern& pat, char cs_precedes, char sep_by_space, char sign_posn) +__init_pat(money_base::pattern& pat, basic_string<charT>& __curr_symbol_, + bool intl, char cs_precedes, char sep_by_space, char sign_posn, + charT space_char) { const char sign = static_cast<char>(money_base::sign); const char space = static_cast<char>(money_base::space); const char none = static_cast<char>(money_base::none); const char symbol = static_cast<char>(money_base::symbol); const char value = static_cast<char>(money_base::value); + const bool symbol_contains_sep = intl && __curr_symbol_.size() == 4; + + // Comments on case branches reflect 'C11 7.11.2.1 The localeconv + // function'. "Space between sign and symbol or value" means that + // if the sign is adjacent to the symbol, there's a space between + // them, and otherwise there's a space between the sign and value. + // + // C11's localeconv specifies that the fourth character of an + // international curr_symbol is used to separate the sign and + // value when sep_by_space says to do so. C++ can't represent + // that, so we just use a space. When sep_by_space says to + // separate the symbol and value-or-sign with a space, we rearrange the + // curr_symbol to put its spacing character on the correct side of + // the symbol. + // + // We also need to avoid adding an extra space between the sign + // and value when the currency symbol is suppressed (by not + // setting showbase). We match glibc's strfmon by interpreting + // sep_by_space==1 as "omit the space when the currency symbol is + // absent". + // + // Users who want to get this right should use ICU instead. + switch (cs_precedes) { - case 0: + case 0: // value before curr_symbol + if (symbol_contains_sep) { + // Move the separator to before the symbol, to place it + // between the value and symbol. + rotate(__curr_symbol_.begin(), __curr_symbol_.begin() + 3, + __curr_symbol_.end()); + } switch (sign_posn) { - case 0: + case 0: // Parentheses surround the quantity and currency symbol. pat.field[0] = sign; pat.field[1] = value; + pat.field[2] = none; // Any space appears in the symbol. pat.field[3] = symbol; switch (sep_by_space) { - case 0: - pat.field[2] = none; + case 0: // No space separates the currency symbol and value. + // This case may have changed between C99 and C11; + // assume the currency symbol matches the intention. + case 2: // Space between sign and currency or value. + // The "sign" is two parentheses, so no space here either. return; - case 1: - case 2: - pat.field[2] = space; + case 1: // Space between currency-and-sign or currency and value. + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[2]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.insert(0, 1, space_char); + } return; default: break; } break; - case 1: + case 1: // The sign string precedes the quantity and currency symbol. pat.field[0] = sign; pat.field[3] = symbol; switch (sep_by_space) { - case 0: + case 0: // No space separates the currency symbol and value. pat.field[1] = value; pat.field[2] = none; return; - case 1: + case 1: // Space between currency-and-sign or currency and value. pat.field[1] = value; - pat.field[2] = space; + pat.field[2] = none; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[2]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.insert(0, 1, space_char); + } return; - case 2: + case 2: // Space between sign and currency or value. pat.field[1] = space; pat.field[2] = value; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // has already appeared after the sign. + __curr_symbol_.erase(__curr_symbol_.begin()); + } return; default: break; } break; - case 2: + case 2: // The sign string succeeds the quantity and currency symbol. pat.field[0] = value; pat.field[3] = sign; switch (sep_by_space) { - case 0: + case 0: // No space separates the currency symbol and value. pat.field[1] = none; pat.field[2] = symbol; return; - case 1: - pat.field[1] = space; + case 1: // Space between currency-and-sign or currency and value. + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[1]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.insert(0, 1, space_char); + } + pat.field[1] = none; pat.field[2] = symbol; return; - case 2: + case 2: // Space between sign and currency or value. pat.field[1] = symbol; pat.field[2] = space; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // should not be removed if showbase is absent. + __curr_symbol_.erase(__curr_symbol_.begin()); + } return; default: break; } break; - case 3: + case 3: // The sign string immediately precedes the currency symbol. pat.field[0] = value; pat.field[3] = symbol; switch (sep_by_space) { - case 0: + case 0: // No space separates the currency symbol and value. pat.field[1] = none; pat.field[2] = sign; return; - case 1: + case 1: // Space between currency-and-sign or currency and value. pat.field[1] = space; pat.field[2] = sign; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // has already appeared before the sign. + __curr_symbol_.erase(__curr_symbol_.begin()); + } return; - case 2: + case 2: // Space between sign and currency or value. pat.field[1] = sign; - pat.field[2] = space; + pat.field[2] = none; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[2]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.insert(0, 1, space_char); + } return; default: break; } break; - case 4: + case 4: // The sign string immediately succeeds the currency symbol. pat.field[0] = value; pat.field[3] = sign; switch (sep_by_space) { - case 0: + case 0: // No space separates the currency symbol and value. pat.field[1] = none; pat.field[2] = symbol; return; - case 1: - pat.field[1] = space; + case 1: // Space between currency-and-sign or currency and value. + pat.field[1] = none; pat.field[2] = symbol; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[1]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.insert(0, 1, space_char); + } return; - case 2: + case 2: // Space between sign and currency or value. pat.field[1] = symbol; pat.field[2] = space; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // should not disappear when showbase is absent. + __curr_symbol_.erase(__curr_symbol_.begin()); + } return; default: break; @@ -5394,105 +5554,157 @@ __init_pat(money_base::pattern& pat, char cs_precedes, char sep_by_space, char s break; } break; - case 1: + case 1: // curr_symbol before value switch (sign_posn) { - case 0: + case 0: // Parentheses surround the quantity and currency symbol. pat.field[0] = sign; pat.field[1] = symbol; + pat.field[2] = none; // Any space appears in the symbol. pat.field[3] = value; switch (sep_by_space) { - case 0: - pat.field[2] = none; + case 0: // No space separates the currency symbol and value. + // This case may have changed between C99 and C11; + // assume the currency symbol matches the intention. + case 2: // Space between sign and currency or value. + // The "sign" is two parentheses, so no space here either. return; - case 1: - case 2: - pat.field[2] = space; + case 1: // Space between currency-and-sign or currency and value. + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[2]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.insert(0, 1, space_char); + } return; default: break; } break; - case 1: + case 1: // The sign string precedes the quantity and currency symbol. pat.field[0] = sign; pat.field[3] = value; switch (sep_by_space) { - case 0: + case 0: // No space separates the currency symbol and value. pat.field[1] = symbol; pat.field[2] = none; return; - case 1: + case 1: // Space between currency-and-sign or currency and value. pat.field[1] = symbol; - pat.field[2] = space; + pat.field[2] = none; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[2]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.push_back(space_char); + } return; - case 2: + case 2: // Space between sign and currency or value. pat.field[1] = space; pat.field[2] = symbol; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // has already appeared after the sign. + __curr_symbol_.pop_back(); + } return; default: break; } break; - case 2: + case 2: // The sign string succeeds the quantity and currency symbol. pat.field[0] = symbol; pat.field[3] = sign; switch (sep_by_space) { - case 0: + case 0: // No space separates the currency symbol and value. pat.field[1] = none; pat.field[2] = value; return; - case 1: - pat.field[1] = space; + case 1: // Space between currency-and-sign or currency and value. + pat.field[1] = none; pat.field[2] = value; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[1]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.push_back(space_char); + } return; - case 2: + case 2: // Space between sign and currency or value. pat.field[1] = value; pat.field[2] = space; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // will appear before the sign. + __curr_symbol_.pop_back(); + } return; default: break; } break; - case 3: + case 3: // The sign string immediately precedes the currency symbol. pat.field[0] = sign; pat.field[3] = value; switch (sep_by_space) { - case 0: + case 0: // No space separates the currency symbol and value. pat.field[1] = symbol; pat.field[2] = none; return; - case 1: + case 1: // Space between currency-and-sign or currency and value. pat.field[1] = symbol; - pat.field[2] = space; + pat.field[2] = none; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[2]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.push_back(space_char); + } return; - case 2: + case 2: // Space between sign and currency or value. pat.field[1] = space; pat.field[2] = symbol; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // has already appeared after the sign. + __curr_symbol_.pop_back(); + } return; default: break; } break; - case 4: + case 4: // The sign string immediately succeeds the currency symbol. pat.field[0] = symbol; pat.field[3] = value; switch (sep_by_space) { - case 0: + case 0: // No space separates the currency symbol and value. pat.field[1] = sign; pat.field[2] = none; return; - case 1: + case 1: // Space between currency-and-sign or currency and value. pat.field[1] = sign; pat.field[2] = space; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // should not disappear when showbase is absent. + __curr_symbol_.pop_back(); + } return; - case 2: - pat.field[1] = space; + case 2: // Space between sign and currency or value. + pat.field[1] = none; pat.field[2] = sign; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[1]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.push_back(space_char); + } return; default: break; @@ -5518,11 +5730,11 @@ moneypunct_byname<char, false>::init(const char* nm) typedef moneypunct<char, false> base; __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); #ifndef _LIBCPP_NO_EXCEPTIONS - if (loc == 0) + if (loc == nullptr) throw runtime_error("moneypunct_byname" " failed to construct for " + string(nm)); #endif // _LIBCPP_NO_EXCEPTIONS -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS lconv* lc = localeconv_l(loc.get()); #else lconv* lc = __localeconv_l(loc.get()); @@ -5549,8 +5761,14 @@ moneypunct_byname<char, false>::init(const char* nm) __negative_sign_ = "()"; else __negative_sign_ = lc->negative_sign; - __init_pat(__pos_format_, lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn); - __init_pat(__neg_format_, lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn); + // Assume the positive and negative formats will want spaces in + // the same places in curr_symbol since there's no way to + // represent anything else. + string_type __dummy_curr_symbol = __curr_symbol_; + __init_pat(__pos_format_, __dummy_curr_symbol, false, + lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, ' '); + __init_pat(__neg_format_, __curr_symbol_, false, + lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, ' '); } template<> @@ -5560,11 +5778,11 @@ moneypunct_byname<char, true>::init(const char* nm) typedef moneypunct<char, true> base; __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); #ifndef _LIBCPP_NO_EXCEPTIONS - if (loc == 0) + if (loc == nullptr) throw runtime_error("moneypunct_byname" " failed to construct for " + string(nm)); #endif // _LIBCPP_NO_EXCEPTIONS -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS lconv* lc = localeconv_l(loc.get()); #else lconv* lc = __localeconv_l(loc.get()); @@ -5583,7 +5801,7 @@ moneypunct_byname<char, true>::init(const char* nm) __frac_digits_ = lc->int_frac_digits; else __frac_digits_ = base::do_frac_digits(); -#if _WIN32 +#ifdef _WIN32 if (lc->p_sign_posn == 0) #else // _WIN32 if (lc->int_p_sign_posn == 0) @@ -5591,7 +5809,7 @@ moneypunct_byname<char, true>::init(const char* nm) __positive_sign_ = "()"; else __positive_sign_ = lc->positive_sign; -#if _WIN32 +#ifdef _WIN32 if(lc->n_sign_posn == 0) #else // _WIN32 if (lc->int_n_sign_posn == 0) @@ -5599,12 +5817,22 @@ moneypunct_byname<char, true>::init(const char* nm) __negative_sign_ = "()"; else __negative_sign_ = lc->negative_sign; -#if _WIN32 - __init_pat(__pos_format_, lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn); - __init_pat(__neg_format_, lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn); + // Assume the positive and negative formats will want spaces in + // the same places in curr_symbol since there's no way to + // represent anything else. + string_type __dummy_curr_symbol = __curr_symbol_; +#ifdef _WIN32 + __init_pat(__pos_format_, __dummy_curr_symbol, true, + lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, ' '); + __init_pat(__neg_format_, __curr_symbol_, true, + lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, ' '); #else - __init_pat(__pos_format_, lc->int_p_cs_precedes, lc->int_p_sep_by_space, lc->int_p_sign_posn); - __init_pat(__neg_format_, lc->int_n_cs_precedes, lc->int_n_sep_by_space, lc->int_n_sign_posn); + __init_pat(__pos_format_, __dummy_curr_symbol, true, + lc->int_p_cs_precedes, lc->int_p_sep_by_space, + lc->int_p_sign_posn, ' '); + __init_pat(__neg_format_, __curr_symbol_, true, + lc->int_n_cs_precedes, lc->int_n_sep_by_space, + lc->int_n_sign_posn, ' '); #endif // _WIN32 } @@ -5615,11 +5843,11 @@ moneypunct_byname<wchar_t, false>::init(const char* nm) typedef moneypunct<wchar_t, false> base; __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); #ifndef _LIBCPP_NO_EXCEPTIONS - if (loc == 0) + if (loc == nullptr) throw runtime_error("moneypunct_byname" " failed to construct for " + string(nm)); #endif // _LIBCPP_NO_EXCEPTIONS -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS lconv* lc = localeconv_l(loc.get()); #else lconv* lc = __localeconv_l(loc.get()); @@ -5636,12 +5864,12 @@ moneypunct_byname<wchar_t, false>::init(const char* nm) wchar_t wbuf[100]; mbstate_t mb = {0}; const char* bb = lc->currency_symbol; -#ifdef _LIBCPP_STABLE_APPLE_ABI - size_t j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get()); #else - size_t j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); + size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get()); #endif - if (j == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); wchar_t* wbe = wbuf + j; __curr_symbol_.assign(wbuf, wbe); @@ -5655,12 +5883,12 @@ moneypunct_byname<wchar_t, false>::init(const char* nm) { mb = mbstate_t(); bb = lc->positive_sign; -#ifdef _LIBCPP_STABLE_APPLE_ABI - j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get()); #else - j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); + j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get()); #endif - if (j == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); wbe = wbuf + j; __positive_sign_.assign(wbuf, wbe); @@ -5671,18 +5899,24 @@ moneypunct_byname<wchar_t, false>::init(const char* nm) { mb = mbstate_t(); bb = lc->negative_sign; -#ifdef _LIBCPP_STABLE_APPLE_ABI - j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get()); #else - j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); + j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get()); #endif - if (j == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); wbe = wbuf + j; __negative_sign_.assign(wbuf, wbe); } - __init_pat(__pos_format_, lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn); - __init_pat(__neg_format_, lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn); + // Assume the positive and negative formats will want spaces in + // the same places in curr_symbol since there's no way to + // represent anything else. + string_type __dummy_curr_symbol = __curr_symbol_; + __init_pat(__pos_format_, __dummy_curr_symbol, false, + lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, L' '); + __init_pat(__neg_format_, __curr_symbol_, false, + lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, L' '); } template<> @@ -5692,11 +5926,11 @@ moneypunct_byname<wchar_t, true>::init(const char* nm) typedef moneypunct<wchar_t, true> base; __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); #ifndef _LIBCPP_NO_EXCEPTIONS - if (loc == 0) + if (loc == nullptr) throw runtime_error("moneypunct_byname" " failed to construct for " + string(nm)); #endif // _LIBCPP_NO_EXCEPTIONS -#ifdef _LIBCPP_STABLE_APPLE_ABI +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS lconv* lc = localeconv_l(loc.get()); #else lconv* lc = __localeconv_l(loc.get()); @@ -5713,12 +5947,12 @@ moneypunct_byname<wchar_t, true>::init(const char* nm) wchar_t wbuf[100]; mbstate_t mb = {0}; const char* bb = lc->int_curr_symbol; -#ifdef _LIBCPP_STABLE_APPLE_ABI - size_t j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get()); #else - size_t j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); + size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get()); #endif - if (j == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); wchar_t* wbe = wbuf + j; __curr_symbol_.assign(wbuf, wbe); @@ -5726,7 +5960,7 @@ moneypunct_byname<wchar_t, true>::init(const char* nm) __frac_digits_ = lc->int_frac_digits; else __frac_digits_ = base::do_frac_digits(); -#if _WIN32 +#ifdef _WIN32 if (lc->p_sign_posn == 0) #else // _WIN32 if (lc->int_p_sign_posn == 0) @@ -5736,17 +5970,17 @@ moneypunct_byname<wchar_t, true>::init(const char* nm) { mb = mbstate_t(); bb = lc->positive_sign; -#ifdef _LIBCPP_STABLE_APPLE_ABI - j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get()); #else - j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); + j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get()); #endif - if (j == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); wbe = wbuf + j; __positive_sign_.assign(wbuf, wbe); } -#if _WIN32 +#ifdef _WIN32 if (lc->n_sign_posn == 0) #else // _WIN32 if (lc->int_n_sign_posn == 0) @@ -5756,22 +5990,32 @@ moneypunct_byname<wchar_t, true>::init(const char* nm) { mb = mbstate_t(); bb = lc->negative_sign; -#ifdef _LIBCPP_STABLE_APPLE_ABI - j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get()); #else - j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); + j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get()); #endif - if (j == -1) + if (j == size_t(-1)) __throw_runtime_error("locale not supported"); wbe = wbuf + j; __negative_sign_.assign(wbuf, wbe); } -#if _WIN32 - __init_pat(__pos_format_, lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn); - __init_pat(__neg_format_, lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn); + // Assume the positive and negative formats will want spaces in + // the same places in curr_symbol since there's no way to + // represent anything else. + string_type __dummy_curr_symbol = __curr_symbol_; +#ifdef _WIN32 + __init_pat(__pos_format_, __dummy_curr_symbol, true, + lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, L' '); + __init_pat(__neg_format_, __curr_symbol_, true, + lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, L' '); #else // _WIN32 - __init_pat(__pos_format_, lc->int_p_cs_precedes, lc->int_p_sep_by_space, lc->int_p_sign_posn); - __init_pat(__neg_format_, lc->int_n_cs_precedes, lc->int_n_sep_by_space, lc->int_n_sign_posn); + __init_pat(__pos_format_, __dummy_curr_symbol, true, + lc->int_p_cs_precedes, lc->int_p_sep_by_space, + lc->int_p_sign_posn, L' '); + __init_pat(__neg_format_, __curr_symbol_, true, + lc->int_n_cs_precedes, lc->int_n_sep_by_space, + lc->int_n_sign_posn, L' '); #endif // _WIN32 } @@ -5790,14 +6034,14 @@ template class collate<wchar_t>; template class num_get<char>; template class num_get<wchar_t>; -template class __num_get<char>; -template class __num_get<wchar_t>; +template struct __num_get<char>; +template struct __num_get<wchar_t>; template class num_put<char>; template class num_put<wchar_t>; -template class __num_put<char>; -template class __num_put<wchar_t>; +template struct __num_put<char>; +template struct __num_put<wchar_t>; template class time_get<char>; template class time_get<wchar_t>; diff --git a/system/lib/libcxx/memory.cpp b/system/lib/libcxx/memory.cpp index cb5e5e7b..98bcc864 100644 --- a/system/lib/libcxx/memory.cpp +++ b/system/lib/libcxx/memory.cpp @@ -7,7 +7,10 @@ // //===----------------------------------------------------------------------===// +#define _LIBCPP_BUILDING_MEMORY #include "memory" +#include "mutex" +#include "thread" _LIBCPP_BEGIN_NAMESPACE_STD @@ -100,10 +103,7 @@ __shared_weak_count::lock() _NOEXCEPT if (__sync_bool_compare_and_swap(&__shared_owners_, object_owners, object_owners+1)) - { - __add_weak(); return this; - } object_owners = __shared_owners_; } return 0; @@ -119,6 +119,61 @@ __shared_weak_count::__get_deleter(const type_info&) const _NOEXCEPT #endif // _LIBCPP_NO_RTTI +#if __has_feature(cxx_atomic) + +static const std::size_t __sp_mut_count = 16; +static pthread_mutex_t mut_back_imp[__sp_mut_count] = +{ + PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER +}; + +static mutex* mut_back = reinterpret_cast<std::mutex*>(mut_back_imp); + +_LIBCPP_CONSTEXPR __sp_mut::__sp_mut(void* p) _NOEXCEPT + : __lx(p) +{ +} + +void +__sp_mut::lock() _NOEXCEPT +{ + mutex& m = *static_cast<mutex*>(__lx); + unsigned count = 0; + while (!m.try_lock()) + { + if (++count > 16) + { + m.lock(); + break; + } + this_thread::yield(); + } +} + +void +__sp_mut::unlock() _NOEXCEPT +{ + static_cast<mutex*>(__lx)->unlock(); +} + +__sp_mut& +__get_sp_mut(const void* p) +{ + static __sp_mut muts[__sp_mut_count] + { + &mut_back[ 0], &mut_back[ 1], &mut_back[ 2], &mut_back[ 3], + &mut_back[ 4], &mut_back[ 5], &mut_back[ 6], &mut_back[ 7], + &mut_back[ 8], &mut_back[ 9], &mut_back[10], &mut_back[11], + &mut_back[12], &mut_back[13], &mut_back[14], &mut_back[15] + }; + return muts[hash<const void*>()(p) & (__sp_mut_count-1)]; +} + +#endif // __has_feature(cxx_atomic) + void declare_reachable(void*) { @@ -154,7 +209,7 @@ align(size_t alignment, size_t size, void*& ptr, size_t& space) { char* p1 = static_cast<char*>(ptr); char* p2 = (char*)((size_t)(p1 + (alignment - 1)) & -alignment); - ptrdiff_t d = p2 - p1; + size_t d = static_cast<size_t>(p2 - p1); if (d <= space - size) { r = p2; diff --git a/system/lib/libcxx/mutex.cpp b/system/lib/libcxx/mutex.cpp index 16817198..42195aa8 100644 --- a/system/lib/libcxx/mutex.cpp +++ b/system/lib/libcxx/mutex.cpp @@ -7,6 +7,7 @@ // //===----------------------------------------------------------------------===// +#define _LIBCPP_BUILDING_MUTEX #include "mutex" #include "limits" #include "system_error" @@ -20,8 +21,7 @@ const adopt_lock_t adopt_lock = {}; mutex::~mutex() { - int e = pthread_mutex_destroy(&__m_); -// assert(e == 0); + pthread_mutex_destroy(&__m_); } void @@ -33,13 +33,13 @@ mutex::lock() } bool -mutex::try_lock() +mutex::try_lock() _NOEXCEPT { return pthread_mutex_trylock(&__m_) == 0; } void -mutex::unlock() +mutex::unlock() _NOEXCEPT { int ec = pthread_mutex_unlock(&__m_); assert(ec == 0); @@ -91,14 +91,14 @@ recursive_mutex::lock() } void -recursive_mutex::unlock() +recursive_mutex::unlock() _NOEXCEPT { int e = pthread_mutex_unlock(&__m_); assert(e == 0); } bool -recursive_mutex::try_lock() +recursive_mutex::try_lock() _NOEXCEPT { return pthread_mutex_trylock(&__m_) == 0; } @@ -125,7 +125,7 @@ timed_mutex::lock() } bool -timed_mutex::try_lock() +timed_mutex::try_lock() _NOEXCEPT { unique_lock<mutex> lk(__m_, try_to_lock); if (lk.owns_lock() && !__locked_) @@ -137,7 +137,7 @@ timed_mutex::try_lock() } void -timed_mutex::unlock() +timed_mutex::unlock() _NOEXCEPT { lock_guard<mutex> _(__m_); __locked_ = false; @@ -176,7 +176,7 @@ recursive_timed_mutex::lock() } bool -recursive_timed_mutex::try_lock() +recursive_timed_mutex::try_lock() _NOEXCEPT { pthread_t id = pthread_self(); unique_lock<mutex> lk(__m_, try_to_lock); @@ -192,7 +192,7 @@ recursive_timed_mutex::try_lock() } void -recursive_timed_mutex::unlock() +recursive_timed_mutex::unlock() _NOEXCEPT { unique_lock<mutex> lk(__m_); if (--__count_ == 0) diff --git a/system/lib/libcxx/new.cpp b/system/lib/libcxx/new.cpp index 1e8ed88d..b23a516f 100644 --- a/system/lib/libcxx/new.cpp +++ b/system/lib/libcxx/new.cpp @@ -11,14 +11,26 @@ #include "new" -#if __APPLE__ +#ifndef __has_include +#define __has_include(inc) 0 +#endif + +#ifdef __APPLE__ #include <cxxabi.h> - // On Darwin, there are two STL shared libraries and a lower level ABI - // shared libray. The global holding the current new handler is - // in the ABI library and named __cxa_new_handler. - #define __new_handler __cxxabiapple::__cxa_new_handler + + #ifndef _LIBCPPABI_VERSION + // On Darwin, there are two STL shared libraries and a lower level ABI + // shared libray. The global holding the current new handler is + // in the ABI library and named __cxa_new_handler. + #define __new_handler __cxxabiapple::__cxa_new_handler + #endif #else // __APPLE__ - static std::new_handler __new_handler; + #if defined(LIBCXXRT) || __has_include(<cxxabi.h>) + #include <cxxabi.h> + #endif // __has_include(<cxxabi.h>) + #ifndef _LIBCPPABI_VERSION + static std::new_handler __new_handler; + #endif // _LIBCPPABI_VERSION #endif // Implement all new and delete operators as weak definitions @@ -83,7 +95,7 @@ operator new[](size_t size) __attribute__((__weak__, __visibility__("default"))) void* -operator new[](size_t size, const std::nothrow_t& nothrow) _NOEXCEPT +operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT { void* p = 0; #ifndef _LIBCPP_NO_EXCEPTIONS @@ -134,6 +146,8 @@ namespace std const nothrow_t nothrow = {}; +#ifndef _LIBCPPABI_VERSION + new_handler set_new_handler(new_handler handler) _NOEXCEPT { @@ -146,6 +160,8 @@ get_new_handler() _NOEXCEPT return __sync_fetch_and_add(&__new_handler, (new_handler)0); } +#ifndef LIBCXXRT + bad_alloc::bad_alloc() _NOEXCEPT { } @@ -160,6 +176,8 @@ bad_alloc::what() const _NOEXCEPT return "std::bad_alloc"; } +#endif //LIBCXXRT + bad_array_new_length::bad_array_new_length() _NOEXCEPT { } @@ -174,6 +192,8 @@ bad_array_new_length::what() const _NOEXCEPT return "bad_array_new_length"; } +#endif + void __throw_bad_alloc() { diff --git a/system/lib/libcxx/random.cpp b/system/lib/libcxx/random.cpp index eca97bc8..97a40c50 100644 --- a/system/lib/libcxx/random.cpp +++ b/system/lib/libcxx/random.cpp @@ -10,6 +10,9 @@ #include "random" #include "system_error" +#ifdef __sun__ +#define rename solaris_headers_are_broken +#endif #include <fcntl.h> #include <unistd.h> #include <errno.h> @@ -37,7 +40,7 @@ random_device::operator()() } double -random_device::entropy() const +random_device::entropy() const _NOEXCEPT { return 0; } diff --git a/system/lib/libcxx/readme.txt b/system/lib/libcxx/readme.txt index c7e41df9..97d8db86 100644 --- a/system/lib/libcxx/readme.txt +++ b/system/lib/libcxx/readme.txt @@ -1 +1 @@ -These files are from libc++, svn revision 140465, Sep 24 2011 +These files are from libc++, svn revision 178253, Mar 29 2013 diff --git a/system/lib/libcxx/regex.cpp b/system/lib/libcxx/regex.cpp index 65e9f886..e3ec2810 100644 --- a/system/lib/libcxx/regex.cpp +++ b/system/lib/libcxx/regex.cpp @@ -69,12 +69,17 @@ regex_error::~regex_error() throw() {} namespace { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" + struct collationnames { const char* elem_; char char_; }; +#pragma clang diagnostic pop + const collationnames collatenames[] = { {"A", 0x41}, @@ -190,12 +195,17 @@ const collationnames collatenames[] = {"zero", 0x30} }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" + struct classnames { const char* elem_; ctype_base::mask mask_; }; +#pragma clang diagnostic pop + const classnames ClassNames[] = { {"alnum", ctype_base::alnum}, diff --git a/system/lib/libcxx/stdexcept.cpp b/system/lib/libcxx/stdexcept.cpp index 28917887..0c4e8323 100644 --- a/system/lib/libcxx/stdexcept.cpp +++ b/system/lib/libcxx/stdexcept.cpp @@ -16,6 +16,16 @@ #include <cstddef> #include "system_error" +#ifndef __has_include +#define __has_include(inc) 0 +#endif + +#ifdef __APPLE__ +#include <cxxabi.h> +#elif defined(LIBCXXRT) || __has_include(<cxxabi.h>) +#include <cxxabi.h> +#endif + // Note: optimize for size #pragma GCC visibility push(hidden) @@ -29,7 +39,7 @@ private: const char* str_; typedef std::size_t unused_t; - typedef std::int32_t count_t; + typedef std::ptrdiff_t count_t; static const std::ptrdiff_t offset = static_cast<std::ptrdiff_t>(2*sizeof(unused_t) + sizeof(count_t)); @@ -67,7 +77,7 @@ __libcpp_nmstr::operator=(const __libcpp_nmstr& s) const char* p = str_; str_ = s.str_; __sync_add_and_fetch(&count(), 1); - if (__sync_add_and_fetch((count_t*)(p-sizeof(count_t)), -1) < 0) + if (__sync_add_and_fetch((count_t*)(p-sizeof(count_t)), count_t(-1)) < 0) delete [] (p-offset); return *this; } @@ -75,7 +85,7 @@ __libcpp_nmstr::operator=(const __libcpp_nmstr& s) inline __libcpp_nmstr::~__libcpp_nmstr() { - if (__sync_add_and_fetch(&count(), -1) < 0) + if (__sync_add_and_fetch(&count(), count_t(-1)) < 0) delete [] (str_ - offset); } @@ -113,6 +123,8 @@ logic_error::operator=(const logic_error& le) _NOEXCEPT return *this; } +#ifndef _LIBCPPABI_VERSION + logic_error::~logic_error() _NOEXCEPT { __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_; @@ -126,6 +138,8 @@ logic_error::what() const _NOEXCEPT return s.c_str(); } +#endif + runtime_error::runtime_error(const string& msg) { __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_; @@ -153,6 +167,8 @@ runtime_error::operator=(const runtime_error& le) _NOEXCEPT return *this; } +#ifndef _LIBCPPABI_VERSION + runtime_error::~runtime_error() _NOEXCEPT { __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_; @@ -175,4 +191,6 @@ range_error::~range_error() _NOEXCEPT {} overflow_error::~overflow_error() _NOEXCEPT {} underflow_error::~underflow_error() _NOEXCEPT {} +#endif + } // std diff --git a/system/lib/libcxx/string.cpp b/system/lib/libcxx/string.cpp index 1f58e365..c71af4fe 100644 --- a/system/lib/libcxx/string.cpp +++ b/system/lib/libcxx/string.cpp @@ -11,7 +11,7 @@ #include "cstdlib" #include "cwchar" #include "cerrno" -#if _WIN32 +#ifdef _WIN32 #include "support/win32/support.h" #endif // _WIN32 @@ -31,17 +31,17 @@ stoi(const string& str, size_t* idx, int base) { char* ptr; const char* const p = str.c_str(); + typename remove_reference<decltype(errno)>::type errno_save = errno; + errno = 0; long r = strtol(p, &ptr, base); - if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) - ptr = const_cast<char*>(p); - if (ptr == p) - { + swap(errno, errno_save); #ifndef _LIBCPP_NO_EXCEPTIONS - if (r == 0) - throw invalid_argument("stoi: no conversion"); + if (errno_save == ERANGE || r < numeric_limits<int>::min() || + numeric_limits<int>::max() < r) throw out_of_range("stoi: out of range"); + if (ptr == p) + throw invalid_argument("stoi: no conversion"); #endif // _LIBCPP_NO_EXCEPTIONS - } if (idx) *idx = static_cast<size_t>(ptr - p); return static_cast<int>(r); @@ -52,17 +52,17 @@ stoi(const wstring& str, size_t* idx, int base) { wchar_t* ptr; const wchar_t* const p = str.c_str(); + typename remove_reference<decltype(errno)>::type errno_save = errno; + errno = 0; long r = wcstol(p, &ptr, base); - if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) - ptr = const_cast<wchar_t*>(p); - if (ptr == p) - { + swap(errno, errno_save); #ifndef _LIBCPP_NO_EXCEPTIONS - if (r == 0) - throw invalid_argument("stoi: no conversion"); + if (errno_save == ERANGE || r < numeric_limits<int>::min() || + numeric_limits<int>::max() < r) throw out_of_range("stoi: out of range"); + if (ptr == p) + throw invalid_argument("stoi: no conversion"); #endif // _LIBCPP_NO_EXCEPTIONS - } if (idx) *idx = static_cast<size_t>(ptr - p); return static_cast<int>(r); @@ -73,15 +73,16 @@ stol(const string& str, size_t* idx, int base) { char* ptr; const char* const p = str.c_str(); + typename remove_reference<decltype(errno)>::type errno_save = errno; + errno = 0; long r = strtol(p, &ptr, base); - if (ptr == p) - { + swap(errno, errno_save); #ifndef _LIBCPP_NO_EXCEPTIONS - if (r == 0) - throw invalid_argument("stol: no conversion"); + if (errno_save == ERANGE) throw out_of_range("stol: out of range"); + if (ptr == p) + throw invalid_argument("stol: no conversion"); #endif // _LIBCPP_NO_EXCEPTIONS - } if (idx) *idx = static_cast<size_t>(ptr - p); return r; @@ -92,15 +93,16 @@ stol(const wstring& str, size_t* idx, int base) { wchar_t* ptr; const wchar_t* const p = str.c_str(); + typename remove_reference<decltype(errno)>::type errno_save = errno; + errno = 0; long r = wcstol(p, &ptr, base); - if (ptr == p) - { + swap(errno, errno_save); #ifndef _LIBCPP_NO_EXCEPTIONS - if (r == 0) - throw invalid_argument("stol: no conversion"); + if (errno_save == ERANGE) throw out_of_range("stol: out of range"); + if (ptr == p) + throw invalid_argument("stol: no conversion"); #endif // _LIBCPP_NO_EXCEPTIONS - } if (idx) *idx = static_cast<size_t>(ptr - p); return r; @@ -111,15 +113,16 @@ stoul(const string& str, size_t* idx, int base) { char* ptr; const char* const p = str.c_str(); + typename remove_reference<decltype(errno)>::type errno_save = errno; + errno = 0; unsigned long r = strtoul(p, &ptr, base); - if (ptr == p) - { + swap(errno, errno_save); #ifndef _LIBCPP_NO_EXCEPTIONS - if (r == 0) - throw invalid_argument("stoul: no conversion"); + if (errno_save == ERANGE) throw out_of_range("stoul: out of range"); + if (ptr == p) + throw invalid_argument("stoul: no conversion"); #endif // _LIBCPP_NO_EXCEPTIONS - } if (idx) *idx = static_cast<size_t>(ptr - p); return r; @@ -130,15 +133,16 @@ stoul(const wstring& str, size_t* idx, int base) { wchar_t* ptr; const wchar_t* const p = str.c_str(); + typename remove_reference<decltype(errno)>::type errno_save = errno; + errno = 0; unsigned long r = wcstoul(p, &ptr, base); - if (ptr == p) - { + swap(errno, errno_save); #ifndef _LIBCPP_NO_EXCEPTIONS - if (r == 0) - throw invalid_argument("stoul: no conversion"); + if (errno_save == ERANGE) throw out_of_range("stoul: out of range"); + if (ptr == p) + throw invalid_argument("stoul: no conversion"); #endif // _LIBCPP_NO_EXCEPTIONS - } if (idx) *idx = static_cast<size_t>(ptr - p); return r; @@ -149,15 +153,16 @@ stoll(const string& str, size_t* idx, int base) { char* ptr; const char* const p = str.c_str(); + typename remove_reference<decltype(errno)>::type errno_save = errno; + errno = 0; long long r = strtoll(p, &ptr, base); - if (ptr == p) - { + swap(errno, errno_save); #ifndef _LIBCPP_NO_EXCEPTIONS - if (r == 0) - throw invalid_argument("stoll: no conversion"); + if (errno_save == ERANGE) throw out_of_range("stoll: out of range"); + if (ptr == p) + throw invalid_argument("stoll: no conversion"); #endif // _LIBCPP_NO_EXCEPTIONS - } if (idx) *idx = static_cast<size_t>(ptr - p); return r; @@ -168,15 +173,16 @@ stoll(const wstring& str, size_t* idx, int base) { wchar_t* ptr; const wchar_t* const p = str.c_str(); + typename remove_reference<decltype(errno)>::type errno_save = errno; + errno = 0; long long r = wcstoll(p, &ptr, base); - if (ptr == p) - { + swap(errno, errno_save); #ifndef _LIBCPP_NO_EXCEPTIONS - if (r == 0) - throw invalid_argument("stoll: no conversion"); + if (errno_save == ERANGE) throw out_of_range("stoll: out of range"); + if (ptr == p) + throw invalid_argument("stoll: no conversion"); #endif // _LIBCPP_NO_EXCEPTIONS - } if (idx) *idx = static_cast<size_t>(ptr - p); return r; @@ -187,15 +193,16 @@ stoull(const string& str, size_t* idx, int base) { char* ptr; const char* const p = str.c_str(); + typename remove_reference<decltype(errno)>::type errno_save = errno; + errno = 0; unsigned long long r = strtoull(p, &ptr, base); - if (ptr == p) - { + swap(errno, errno_save); #ifndef _LIBCPP_NO_EXCEPTIONS - if (r == 0) - throw invalid_argument("stoull: no conversion"); + if (errno_save == ERANGE) throw out_of_range("stoull: out of range"); + if (ptr == p) + throw invalid_argument("stoull: no conversion"); #endif // _LIBCPP_NO_EXCEPTIONS - } if (idx) *idx = static_cast<size_t>(ptr - p); return r; @@ -206,15 +213,16 @@ stoull(const wstring& str, size_t* idx, int base) { wchar_t* ptr; const wchar_t* const p = str.c_str(); + typename remove_reference<decltype(errno)>::type errno_save = errno; + errno = 0; unsigned long long r = wcstoull(p, &ptr, base); - if (ptr == p) - { + swap(errno, errno_save); #ifndef _LIBCPP_NO_EXCEPTIONS - if (r == 0) - throw invalid_argument("stoull: no conversion"); + if (errno_save == ERANGE) throw out_of_range("stoull: out of range"); + if (ptr == p) + throw invalid_argument("stoull: no conversion"); #endif // _LIBCPP_NO_EXCEPTIONS - } if (idx) *idx = static_cast<size_t>(ptr - p); return r; @@ -225,9 +233,9 @@ stof(const string& str, size_t* idx) { char* ptr; const char* const p = str.c_str(); - int errno_save = errno; + typename remove_reference<decltype(errno)>::type errno_save = errno; errno = 0; - double r = strtod(p, &ptr); + float r = strtof(p, &ptr); swap(errno, errno_save); #ifndef _LIBCPP_NO_EXCEPTIONS if (errno_save == ERANGE) @@ -237,7 +245,7 @@ stof(const string& str, size_t* idx) #endif // _LIBCPP_NO_EXCEPTIONS if (idx) *idx = static_cast<size_t>(ptr - p); - return static_cast<float>(r); + return r; } float @@ -245,9 +253,9 @@ stof(const wstring& str, size_t* idx) { wchar_t* ptr; const wchar_t* const p = str.c_str(); - int errno_save = errno; + typename remove_reference<decltype(errno)>::type errno_save = errno; errno = 0; - double r = wcstod(p, &ptr); + float r = wcstof(p, &ptr); swap(errno, errno_save); #ifndef _LIBCPP_NO_EXCEPTIONS if (errno_save == ERANGE) @@ -257,7 +265,7 @@ stof(const wstring& str, size_t* idx) #endif // _LIBCPP_NO_EXCEPTIONS if (idx) *idx = static_cast<size_t>(ptr - p); - return static_cast<float>(r); + return r; } double @@ -265,7 +273,7 @@ stod(const string& str, size_t* idx) { char* ptr; const char* const p = str.c_str(); - int errno_save = errno; + typename remove_reference<decltype(errno)>::type errno_save = errno; errno = 0; double r = strtod(p, &ptr); swap(errno, errno_save); @@ -285,7 +293,7 @@ stod(const wstring& str, size_t* idx) { wchar_t* ptr; const wchar_t* const p = str.c_str(); - int errno_save = errno; + typename remove_reference<decltype(errno)>::type errno_save = errno; errno = 0; double r = wcstod(p, &ptr); swap(errno, errno_save); @@ -305,7 +313,7 @@ stold(const string& str, size_t* idx) { char* ptr; const char* const p = str.c_str(); - int errno_save = errno; + typename remove_reference<decltype(errno)>::type errno_save = errno; errno = 0; long double r = strtold(p, &ptr); swap(errno, errno_save); @@ -325,7 +333,7 @@ stold(const wstring& str, size_t* idx) { wchar_t* ptr; const wchar_t* const p = str.c_str(); - int errno_save = errno; + typename remove_reference<decltype(errno)>::type errno_save = errno; errno = 0; long double r = wcstold(p, &ptr); swap(errno, errno_save); @@ -346,7 +354,7 @@ string to_string(int val) s.resize(s.capacity()); while (true) { - int n2 = snprintf(&s[0], s.size()+1, "%d", val); + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%d", val)); if (n2 <= s.size()) { s.resize(n2); @@ -363,7 +371,7 @@ string to_string(unsigned val) s.resize(s.capacity()); while (true) { - int n2 = snprintf(&s[0], s.size()+1, "%u", val); + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%u", val)); if (n2 <= s.size()) { s.resize(n2); @@ -380,7 +388,7 @@ string to_string(long val) s.resize(s.capacity()); while (true) { - int n2 = snprintf(&s[0], s.size()+1, "%ld", val); + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%ld", val)); if (n2 <= s.size()) { s.resize(n2); @@ -397,7 +405,7 @@ string to_string(unsigned long val) s.resize(s.capacity()); while (true) { - int n2 = snprintf(&s[0], s.size()+1, "%lu", val); + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%lu", val)); if (n2 <= s.size()) { s.resize(n2); @@ -414,7 +422,7 @@ string to_string(long long val) s.resize(s.capacity()); while (true) { - int n2 = snprintf(&s[0], s.size()+1, "%lld", val); + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%lld", val)); if (n2 <= s.size()) { s.resize(n2); @@ -431,7 +439,7 @@ string to_string(unsigned long long val) s.resize(s.capacity()); while (true) { - int n2 = snprintf(&s[0], s.size()+1, "%llu", val); + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%llu", val)); if (n2 <= s.size()) { s.resize(n2); @@ -448,7 +456,7 @@ string to_string(float val) s.resize(s.capacity()); while (true) { - int n2 = snprintf(&s[0], s.size()+1, "%f", val); + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%f", val)); if (n2 <= s.size()) { s.resize(n2); @@ -465,7 +473,7 @@ string to_string(double val) s.resize(s.capacity()); while (true) { - int n2 = snprintf(&s[0], s.size()+1, "%f", val); + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%f", val)); if (n2 <= s.size()) { s.resize(n2); @@ -482,7 +490,7 @@ string to_string(long double val) s.resize(s.capacity()); while (true) { - int n2 = snprintf(&s[0], s.size()+1, "%Lf", val); + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%Lf", val)); if (n2 <= s.size()) { s.resize(n2); @@ -505,7 +513,7 @@ wstring to_wstring(int val) int n2 = swprintf(&s[0], s.size()+1, L"%d", val); if (n2 > 0) { - s.resize(n2); + s.resize(static_cast<size_t>(n2)); break; } s.resize(2*s.size()); @@ -526,7 +534,7 @@ wstring to_wstring(unsigned val) int n2 = swprintf(&s[0], s.size()+1, L"%u", val); if (n2 > 0) { - s.resize(n2); + s.resize(static_cast<size_t>(n2)); break; } s.resize(2*s.size()); @@ -547,7 +555,7 @@ wstring to_wstring(long val) int n2 = swprintf(&s[0], s.size()+1, L"%ld", val); if (n2 > 0) { - s.resize(n2); + s.resize(static_cast<size_t>(n2)); break; } s.resize(2*s.size()); @@ -568,7 +576,7 @@ wstring to_wstring(unsigned long val) int n2 = swprintf(&s[0], s.size()+1, L"%lu", val); if (n2 > 0) { - s.resize(n2); + s.resize(static_cast<size_t>(n2)); break; } s.resize(2*s.size()); @@ -589,7 +597,7 @@ wstring to_wstring(long long val) int n2 = swprintf(&s[0], s.size()+1, L"%lld", val); if (n2 > 0) { - s.resize(n2); + s.resize(static_cast<size_t>(n2)); break; } s.resize(2*s.size()); @@ -610,7 +618,7 @@ wstring to_wstring(unsigned long long val) int n2 = swprintf(&s[0], s.size()+1, L"%llu", val); if (n2 > 0) { - s.resize(n2); + s.resize(static_cast<size_t>(n2)); break; } s.resize(2*s.size()); @@ -629,7 +637,7 @@ wstring to_wstring(float val) int n2 = swprintf(&s[0], s.size()+1, L"%f", val); if (n2 > 0) { - s.resize(n2); + s.resize(static_cast<size_t>(n2)); break; } s.resize(2*s.size()); @@ -648,7 +656,7 @@ wstring to_wstring(double val) int n2 = swprintf(&s[0], s.size()+1, L"%f", val); if (n2 > 0) { - s.resize(n2); + s.resize(static_cast<size_t>(n2)); break; } s.resize(2*s.size()); @@ -667,7 +675,7 @@ wstring to_wstring(long double val) int n2 = swprintf(&s[0], s.size()+1, L"%Lf", val); if (n2 > 0) { - s.resize(n2); + s.resize(static_cast<size_t>(n2)); break; } s.resize(2*s.size()); diff --git a/system/lib/libcxx/strstream.cpp b/system/lib/libcxx/strstream.cpp index 53139509..518422bd 100644 --- a/system/lib/libcxx/strstream.cpp +++ b/system/lib/libcxx/strstream.cpp @@ -34,7 +34,7 @@ void strstreambuf::__init(char* __gnext, streamsize __n, char* __pbeg) { if (__n == 0) - __n = strlen(__gnext); + __n = static_cast<streamsize>(strlen(__gnext)); else if (__n < 0) __n = INT_MAX; if (__pbeg == nullptr) @@ -158,14 +158,16 @@ strstreambuf::overflow(int_type __c) return int_type(EOF); streamsize old_size = (epptr() ? epptr() : egptr()) - eback(); streamsize new_size = max<streamsize>(__alsize_, 2*old_size); + if (new_size == 0) + new_size = __default_alsize; char* buf = nullptr; if (__palloc_) - buf = static_cast<char*>(__palloc_(new_size)); + buf = static_cast<char*>(__palloc_(static_cast<size_t>(new_size))); else buf = new char[new_size]; if (buf == nullptr) return int_type(EOF); - memcpy(buf, eback(), old_size); + memcpy(buf, eback(), static_cast<size_t>(old_size)); ptrdiff_t ninp = gptr() - eback(); ptrdiff_t einp = egptr() - eback(); ptrdiff_t nout = pptr() - pbase(); @@ -179,7 +181,7 @@ strstreambuf::overflow(int_type __c) } setg(buf, buf + ninp, buf + einp); setp(buf + einp, buf + einp + eout); - pbump(nout); + pbump(static_cast<int>(nout)); __strmode_ |= __allocated; } *pptr() = static_cast<char>(__c); diff --git a/system/lib/libcxx/support/solaris/README b/system/lib/libcxx/support/solaris/README new file mode 100644 index 00000000..89c887a3 --- /dev/null +++ b/system/lib/libcxx/support/solaris/README @@ -0,0 +1,4 @@ +This directory contains a partial implementation of the xlocale APIs for +Solaris. Some portions are lifted from FreeBSD libc, and so are covered by a +2-clause BSD license instead of the MIT/UUIC license that the rest of libc++ is +distributed under. diff --git a/system/lib/libcxx/support/solaris/mbsnrtowcs.inc b/system/lib/libcxx/support/solaris/mbsnrtowcs.inc new file mode 100644 index 00000000..07404527 --- /dev/null +++ b/system/lib/libcxx/support/solaris/mbsnrtowcs.inc @@ -0,0 +1,76 @@ + + +/*- + * As noted in the source, some portions of this implementation are copied from + * FreeBSD libc. These are covered by the following copyright: + * + * Copyright (c) 2002-2004 Tim J. Robbins. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +size_t +mbsnrtowcs_l(wchar_t * __restrict dst, const char ** __restrict src, + size_t nms, size_t len, mbstate_t * __restrict ps, locale_t loc) +{ + const char *s; + size_t nchr; + wchar_t wc; + size_t nb; + FIX_LOCALE(loc); + + s = *src; + nchr = 0; + + if (dst == NULL) { + for (;;) { + if ((nb = mbrtowc_l(&wc, s, nms, ps, loc)) == (size_t)-1) + /* Invalid sequence - mbrtowc() sets errno. */ + return ((size_t)-1); + else if (nb == 0 || nb == (size_t)-2) + return (nchr); + s += nb; + nms -= nb; + nchr++; + } + /*NOTREACHED*/ + } + + while (len-- > 0) { + if ((nb = mbrtowc_l(dst, s, nms, ps, loc)) == (size_t)-1) { + *src = s; + return ((size_t)-1); + } else if (nb == (size_t)-2) { + *src = s + nms; + return (nchr); + } else if (nb == 0) { + *src = NULL; + return (nchr); + } + s += nb; + nms -= nb; + nchr++; + dst++; + } + *src = s; + return (nchr); +} diff --git a/system/lib/libcxx/support/solaris/wcsnrtombs.inc b/system/lib/libcxx/support/solaris/wcsnrtombs.inc new file mode 100644 index 00000000..67e7078f --- /dev/null +++ b/system/lib/libcxx/support/solaris/wcsnrtombs.inc @@ -0,0 +1,93 @@ +/*- + * Copyright (c) 2002-2004 Tim J. Robbins. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + + +size_t +wcsnrtombs_l(char * __restrict dst, const wchar_t ** __restrict src, + size_t nwc, size_t len, mbstate_t * __restrict ps, locale_t loc) +{ + FIX_LOCALE(loc); + mbstate_t mbsbak; + char buf[MB_CUR_MAX_L(loc)]; + const wchar_t *s; + size_t nbytes; + size_t nb; + + s = *src; + nbytes = 0; + + if (dst == NULL) { + while (nwc-- > 0) { + if ((nb = wcrtomb_l(buf, *s, ps, loc)) == (size_t)-1) + /* Invalid character - wcrtomb() sets errno. */ + return ((size_t)-1); + else if (*s == L'\0') + return (nbytes + nb - 1); + s++; + nbytes += nb; + } + return (nbytes); + } + + while (len > 0 && nwc-- > 0) { + if (len > (size_t)MB_CUR_MAX_L(loc)) { + /* Enough space to translate in-place. */ + if ((nb = wcrtomb_l(dst, *s, ps, loc)) == (size_t)-1) { + *src = s; + return ((size_t)-1); + } + } else { + /* + * May not be enough space; use temp. buffer. + * + * We need to save a copy of the conversion state + * here so we can restore it if the multibyte + * character is too long for the buffer. + */ + mbsbak = *ps; + if ((nb = wcrtomb_l(buf, *s, ps, loc)) == (size_t)-1) { + *src = s; + return ((size_t)-1); + } + if (nb > (int)len) { + /* MB sequence for character won't fit. */ + *ps = mbsbak; + break; + } + memcpy(dst, buf, nb); + } + if (*s == L'\0') { + *src = NULL; + return (nbytes + nb - 1); + } + s++; + dst += nb; + len -= nb; + nbytes += nb; + } + *src = s; + return (nbytes); +} + diff --git a/system/lib/libcxx/support/solaris/xlocale.c b/system/lib/libcxx/support/solaris/xlocale.c new file mode 100644 index 00000000..a2c1fa90 --- /dev/null +++ b/system/lib/libcxx/support/solaris/xlocale.c @@ -0,0 +1,245 @@ + +#ifdef __sun__ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <dlfcn.h> +#include <locale.h> +#include <limits.h> +#include <assert.h> +#include <sys/localedef.h> +#include "xlocale.h" + +static _LC_locale_t *__C_locale; + +#define FIX_LOCALE(l) l = (l == 0) ? __C_locale : l + +#include "mbsnrtowcs.inc" +#include "wcsnrtombs.inc" + +size_t __mb_cur_max(locale_t __l) { + FIX_LOCALE(__l); + return (__l->lc_ctype->cmapp->cm_mb_cur_max); +} + +wint_t btowc_l(int __c, locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_ctype->cmapp->core.user_api->btowc(__l->lc_ctype->cmapp, __c); +} + +int wctob_l(wint_t __c, locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_ctype->cmapp->core.user_api->wctob(__l->lc_ctype->cmapp, __c); +} + +size_t wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_ctype->cmapp->core.user_api->wcrtomb(__l->lc_ctype->cmapp, + __s, __wc, __ps); +} + +size_t mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n, + mbstate_t *__ps, locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_ctype->cmapp->core.user_api->mbrtowc(__l->lc_ctype->cmapp, + __pwc, __s, __n, __ps); +} + +int mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_ctype->cmapp->core.user_api->mbtowc(__l->lc_ctype->cmapp, + __pwc, __pmb, __max); +} + +size_t mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_ctype->cmapp->core.user_api->mbrlen(__l->lc_ctype->cmapp, __s, + __n, __ps); +} + +struct lconv *localeconv_l(locale_t __l) { + FIX_LOCALE(__l); + return __l->core.user_api->localeconv(__l); +} + +size_t mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len, + mbstate_t *__ps, locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_ctype->cmapp->core.user_api->mbsrtowcs(__l->lc_ctype->cmapp, + __dest, __src, __len, __ps); +} + +int wcscoll_l(const wchar_t *__s1, const wchar_t *__s2, locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_collate->core.user_api->wcscoll(__l->lc_collate, + __s1, __s2); +} + +int strcoll_l(const char *__s1, const char *__s2, locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_collate->core.user_api->strcoll(__l->lc_collate, + __s1, __s2); +} + +size_t strxfrm_l(char *__s1, const char *__s2, size_t __n, locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_collate->core.user_api->strxfrm(__l->lc_collate, + __s1, __s2, __n); +} +size_t strftime_l(char *__s, size_t __size, const char *__fmt, const struct tm + *__tm, locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_time->core.user_api->strftime(__l->lc_time, + __s, __size, __fmt, __tm); +} + +size_t wcsxfrm_l(wchar_t *__ws1, const wchar_t *__ws2, size_t __n, + locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_collate->core.user_api->wcsxfrm(__l->lc_collate, + __ws1, __ws2, __n); +} + +#define LOCALE_ISCTYPE(ctype, m) \ + int is##ctype##_l(int __c, locale_t __l) { \ + if ((__c < 0) || (__c > 255)) return 0;\ + FIX_LOCALE(__l);\ + return __l->lc_ctype->mask[__c] & m;\ + }\ + int isw##ctype##_l(wchar_t __c, locale_t __l) { \ + FIX_LOCALE(__l);\ + return __l->lc_ctype->core.user_api->iswctype(__l->lc_ctype, __c, m);\ + } + +LOCALE_ISCTYPE(alnum, _ISALNUM) +LOCALE_ISCTYPE(alpha, _ISALPHA) +LOCALE_ISCTYPE(blank, _ISALPHA) +LOCALE_ISCTYPE(cntrl, _ISCNTRL) +LOCALE_ISCTYPE(digit, _ISDIGIT) +LOCALE_ISCTYPE(graph, _ISGRAPH) +LOCALE_ISCTYPE(lower, _ISLOWER) +LOCALE_ISCTYPE(print, _ISPRINT) +LOCALE_ISCTYPE(punct, _ISPUNCT) +LOCALE_ISCTYPE(space, _ISSPACE) +LOCALE_ISCTYPE(upper, _ISUPPER) +LOCALE_ISCTYPE(xdigit, _ISXDIGIT) + +int iswctype_l(wint_t __c, wctype_t __m, locale_t __l) { + FIX_LOCALE(__l);\ + return __l->lc_ctype->core.user_api->iswctype(__l->lc_ctype, __c, __m);\ +} + +int toupper_l(int __c, locale_t __l) { + FIX_LOCALE(__l); + if ((__c < 0) || (__c > __l->lc_ctype->max_upper)) return __c; + return __l->lc_ctype->upper[__c]; +} +int tolower_l(int __c, locale_t __l) { + FIX_LOCALE(__l); + if ((__c < 0) || (__c > __l->lc_ctype->max_lower)) return __c; + return __l->lc_ctype->lower[__c]; +} +wint_t towupper_l(wint_t __c, locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_ctype->core.user_api->towupper(__l->lc_ctype, __c); +} +wint_t towlower_l(wint_t __c, locale_t __l) { + FIX_LOCALE(__l); + return __l->lc_ctype->core.user_api->towlower(__l->lc_ctype, __c); +} + +// FIXME: This disregards the locale, which is Very Wrong +#define vsnprintf_l(__s, __n, __l, __format, __va) \ + vsnprintf(__s, __n, __format, __va) + +int sprintf_l(char *__s, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); + int __res = vsnprintf_l(__s, SIZE_MAX, __l, __format, __va); + va_end(__va); + return __res; +} + +int snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) +{ + va_list __va; + va_start(__va, __format); + int __res = vsnprintf_l(__s, __n , __l, __format, __va); + va_end(__va); + return __res; +} + +int asprintf_l(char **__s, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); + // FIXME: + int __res = vasprintf(__s, __format, __va); + va_end(__va); + return __res; +} + +int sscanf_l(const char *__s, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); + // FIXME: + int __res = vsscanf(__s, __format, __va); + va_end(__va); + return __res; +} + +locale_t newlocale(int mask, const char *locale, locale_t base) { + + if ((locale == NULL) || (locale[0] == '\0') || + ((locale[0] == 'C') && (locale[1] == '\0'))) + { + return __C_locale; + } + + // Solaris locales are shared libraries that contain + char *path; +#ifdef __LP64 + asprintf(&path, "/usr/lib/locale/%1$s/amd64/%1$s.so.3", locale); +#else + asprintf(&path, "/usr/lib/locale/%1$s/%1$s.so.3", locale); +#endif + void *handle = dlopen(path, RTLD_LOCAL | RTLD_NOW); + free(path); + if (!handle) + return 0; + _LC_locale_t *(*init)() = dlsym(handle, "instantiate"); + if (!init) + return 0; + _LC_locale_t *p = init(); + if (!p) + return 0; + + if (!base) + base = __C_locale; + + locale_t ret = calloc(1, sizeof(struct _LC_locale_t)); + memcpy(ret, p, sizeof (_LC_locale_t)); + ret->lc_collate = (mask & LC_COLLATE_MASK) ? p->lc_collate : base->lc_collate; + ret->lc_ctype = (mask & LC_CTYPE_MASK) ? p->lc_ctype : base->lc_ctype; + ret->lc_messages = (mask & LC_MESSAGES_MASK) ? p->lc_messages : base->lc_messages; + ret->lc_monetary = (mask & LC_MONETARY_MASK) ? p->lc_monetary : base->lc_monetary; + ret->lc_time = (mask & LC_TIME_MASK) ? p->lc_time : base->lc_time; + return ret; +} + +void freelocale(locale_t loc) +{ + if (loc != __C_locale) + free(loc); +} + +__attribute__((constructor)) +static void setupCLocale(void) { + // The default initial locale is the C locale. This is a statically + // allocated locale inside libc. At program start, __lc_locale will point to + // this. We need to grab a copy because it's not a public symbol. If we had + // access to the source code for libc, then we'd just use it directly... + assert('C' == setlocale(LC_ALL, 0)[0]); + __C_locale = __lc_locale; +} +#endif diff --git a/system/lib/libcxx/support/win32/locale_win32.cpp b/system/lib/libcxx/support/win32/locale_win32.cpp new file mode 100644 index 00000000..02b5874e --- /dev/null +++ b/system/lib/libcxx/support/win32/locale_win32.cpp @@ -0,0 +1,94 @@ +// -*- C++ -*- +//===-------------------- support/win32/locale_win32.cpp ------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "support/win32/locale_win32.h" + +#include <stdarg.h> // va_start, va_end + +// FIXME: base currently unused. Needs manual work to construct the new locale +locale_t newlocale( int mask, const char * locale, locale_t /*base*/ ) +{ + return _create_locale( mask, locale ); +} +locale_t uselocale( locale_t newloc ) +{ + locale_t old_locale = _get_current_locale(); + // uselocale sets the thread's locale by definition, so unconditionally use thread-local locale + _configthreadlocale( _ENABLE_PER_THREAD_LOCALE ); + // uselocale sets all categories + setlocale( LC_ALL, newloc->locinfo->lc_category[LC_ALL].locale ); + // uselocale returns the old locale_t + return old_locale; +} +lconv *localeconv_l( locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return localeconv(); +} +size_t mbrlen_l( const char *__restrict__ s, size_t n, + mbstate_t *__restrict__ ps, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return mbrlen( s, n, ps ); +} +size_t mbsrtowcs_l( wchar_t *__restrict__ dst, const char **__restrict__ src, + size_t len, mbstate_t *__restrict__ ps, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return mbsrtowcs( dst, src, len, ps ); +} +size_t wcrtomb_l( char *__restrict__ s, wchar_t wc, mbstate_t *__restrict__ ps, + locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return wcrtomb( s, wc, ps ); +} +size_t mbrtowc_l( wchar_t *__restrict__ pwc, const char *__restrict__ s, + size_t n, mbstate_t *__restrict__ ps, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return mbrtowc( pwc, s, n, ps ); +} +size_t mbsnrtowcs_l( wchar_t *__restrict__ dst, const char **__restrict__ src, + size_t nms, size_t len, mbstate_t *__restrict__ ps, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return mbsnrtowcs( dst, src, nms, len, ps ); +} +size_t wcsnrtombs_l( char *__restrict__ dst, const wchar_t **__restrict__ src, + size_t nwc, size_t len, mbstate_t *__restrict__ ps, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return wcsnrtombs( dst, src, nwc, len, ps ); +} +wint_t btowc_l( int c, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return btowc( c ); +} +int wctob_l( wint_t c, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return wctob( c ); +} + +int asprintf_l( char **ret, locale_t loc, const char *format, ... ) +{ + va_list ap; + va_start( ap, format ); + int result = vasprintf_l( ret, loc, format, ap ); + va_end(ap); + return result; +} +int vasprintf_l( char **ret, locale_t loc, const char *format, va_list ap ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return vasprintf( ret, format, ap ); +} diff --git a/system/lib/libcxx/support/win32/support.cpp b/system/lib/libcxx/support/win32/support.cpp new file mode 100644 index 00000000..9e85077a --- /dev/null +++ b/system/lib/libcxx/support/win32/support.cpp @@ -0,0 +1,70 @@ +// -*- C++ -*- +//===----------------------- support/win32/support.h ----------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include <support/win32/support.h> +#include <stdarg.h> // va_start, va_end +#include <stddef.h> // size_t +#include <stdlib.h> // malloc +#include <stdio.h> // vsprintf, vsnprintf +#include <string.h> // strcpy, wcsncpy + +int asprintf(char **sptr, const char *__restrict fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int result = vasprintf(sptr, fmt, ap); + va_end(ap); + return result; +} +int vasprintf( char **sptr, const char *__restrict fmt, va_list ap ) +{ + *sptr = NULL; + int count = vsnprintf( *sptr, 0, fmt, ap ); + if( (count >= 0) && ((*sptr = (char*)malloc(count+1)) != NULL) ) + { + vsprintf( *sptr, fmt, ap ); + sptr[count] = '\0'; + } + + return count; +} + +// FIXME: use wcrtomb and avoid copy +// use mbsrtowcs which is available, first copy first nwc elements of src +size_t mbsnrtowcs( wchar_t *__restrict dst, const char **__restrict src, + size_t nmc, size_t len, mbstate_t *__restrict ps ) +{ + char* local_src = new char[nmc+1]; + char* nmcsrc = local_src; + strncpy( nmcsrc, *src, nmc ); + nmcsrc[nmc] = '\0'; + const size_t result = mbsrtowcs( dst, const_cast<const char **>(&nmcsrc), len, ps ); + // propagate error + if( nmcsrc == NULL ) + *src = NULL; + delete[] local_src; + return result; +} +// FIXME: use wcrtomb and avoid copy +// use wcsrtombs which is available, first copy first nwc elements of src +size_t wcsnrtombs( char *__restrict dst, const wchar_t **__restrict src, + size_t nwc, size_t len, mbstate_t *__restrict ps ) +{ + wchar_t* local_src = new wchar_t[nwc]; + wchar_t* nwcsrc = local_src; + wcsncpy(nwcsrc, *src, nwc); + nwcsrc[nwc] = '\0'; + const size_t result = wcsrtombs( dst, const_cast<const wchar_t **>(&nwcsrc), len, ps ); + // propogate error + if( nwcsrc == NULL ) + *src = NULL; + delete[] nwcsrc; + return result; +} diff --git a/system/lib/libcxx/symbols b/system/lib/libcxx/symbols index 23d4a7a4..84f4ddc9 100644 --- a/system/lib/libcxx/symbols +++ b/system/lib/libcxx/symbols @@ -1,66 +1,3 @@ - W _ZGVNSt3__110moneypunctIcLb0EE2idE - W _ZGVNSt3__110moneypunctIcLb1EE2idE - W _ZGVNSt3__110moneypunctIwLb0EE2idE - W _ZGVNSt3__110moneypunctIwLb1EE2idE - W _ZGVNSt3__17collateIcE2idE - W _ZGVNSt3__17collateIwE2idE - W _ZGVNSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE - W _ZGVNSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE - W _ZGVNSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE - W _ZGVNSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE - W _ZGVNSt3__18messagesIcE2idE - W _ZGVNSt3__18messagesIwE2idE - W _ZGVNSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE - W _ZGVNSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE - W _ZGVNSt3__18time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE - W _ZGVNSt3__18time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE - W _ZGVNSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE - W _ZGVNSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE - W _ZGVNSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE - W _ZGVNSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE - d _ZGVZNKSt3__120__time_get_c_storageIcE3__XEvE1s - d _ZGVZNKSt3__120__time_get_c_storageIcE3__cEvE1s - d _ZGVZNKSt3__120__time_get_c_storageIcE3__rEvE1s - d _ZGVZNKSt3__120__time_get_c_storageIcE3__xEvE1s - d _ZGVZNKSt3__120__time_get_c_storageIcE7__am_pmEvE5am_pm - d _ZGVZNKSt3__120__time_get_c_storageIcE7__weeksEvE5weeks - d _ZGVZNKSt3__120__time_get_c_storageIcE8__monthsEvE6months - d _ZGVZNKSt3__120__time_get_c_storageIwE3__XEvE1s - d _ZGVZNKSt3__120__time_get_c_storageIwE3__cEvE1s - d _ZGVZNKSt3__120__time_get_c_storageIwE3__rEvE1s - d _ZGVZNKSt3__120__time_get_c_storageIwE3__xEvE1s - d _ZGVZNKSt3__120__time_get_c_storageIwE7__am_pmEvE5am_pm - d _ZGVZNKSt3__120__time_get_c_storageIwE7__weeksEvE5weeks - d _ZGVZNKSt3__120__time_get_c_storageIwE8__monthsEvE6months - d _ZGVZNSt3__112_GLOBAL__N_13mutEvE1m - d _ZGVZNSt3__112__rs_defaultclEvE6__rs_g - d _ZGVZNSt3__115future_categoryEvE3__f - d _ZGVZNSt3__115system_categoryEvE1s - d _ZGVZNSt3__116generic_categoryEvE1s - d _ZGVZNSt3__117iostream_categoryEvE1s - d _ZGVZNSt3__119__thread_local_dataEvE3__p - d _ZGVZNSt3__16__clocEvE6result - d _ZGVZNSt3__16locale7classicEvE1c - d _ZGVZNSt3__16locale8__globalEvE1g - d _ZGVZNSt3__18__get_dbEvE2db - d _ZGVZNSt3__1L10init_am_pmEvE5am_pm - d _ZGVZNSt3__1L10init_weeksEvE5weeks - d _ZGVZNSt3__1L11init_monthsEvE6months - d _ZGVZNSt3__1L11init_wam_pmEvE5am_pm - d _ZGVZNSt3__1L11init_wweeksEvE5weeks - d _ZGVZNSt3__1L12init_wmonthsEvE6months - d _ZL19__terminate_handler - d _ZL20__unexpected_handler - T _ZN12_GLOBAL__N_114__libcpp_nmstrC1EPKc - T _ZN12_GLOBAL__N_114__libcpp_nmstrC1ERKS0_ - t _ZN12_GLOBAL__N_114__libcpp_nmstrC2EPKc - t _ZN12_GLOBAL__N_114__libcpp_nmstrC2ERKS0_ - T _ZN12_GLOBAL__N_114__libcpp_nmstrD1Ev - t _ZN12_GLOBAL__N_114__libcpp_nmstrD2Ev - t _ZN12_GLOBAL__N_114__libcpp_nmstraSERKS0_ - t _ZNK12_GLOBAL__N_114__libcpp_nmstr5c_strEv - t _ZNK12_GLOBAL__N_114__libcpp_nmstr5countEv - T _ZNKSt10bad_typeid4whatEv T _ZNKSt11logic_error4whatEv T _ZNKSt13bad_exception4whatEv T _ZNKSt13runtime_error4whatEv @@ -148,8 +85,8 @@ T _ZNKSt3__111__libcpp_db17__dereferenceableEPKv T _ZNKSt3__111__libcpp_db17__find_c_and_lockEPv T _ZNKSt3__111__libcpp_db6unlockEv + T _ZNKSt3__111__libcpp_db8__find_cEPv T _ZNKSt3__111__libcpp_db9__addableEPKvi - t _ZNKSt3__112_GLOBAL__N_111__fake_bindclEv T _ZNKSt3__112__do_message7messageEi T _ZNKSt3__112bad_weak_ptr4whatEv W _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE12__invariantsEv @@ -278,14 +215,14 @@ T _ZNKSt3__112ctype_bynameIcE10do_tolowerEc T _ZNKSt3__112ctype_bynameIcE10do_toupperEPcPKc T _ZNKSt3__112ctype_bynameIcE10do_toupperEc - T _ZNKSt3__112ctype_bynameIwE10do_scan_isEjPKwS3_ + T _ZNKSt3__112ctype_bynameIwE10do_scan_isEtPKwS3_ T _ZNKSt3__112ctype_bynameIwE10do_tolowerEPwPKw T _ZNKSt3__112ctype_bynameIwE10do_tolowerEw T _ZNKSt3__112ctype_bynameIwE10do_toupperEPwPKw T _ZNKSt3__112ctype_bynameIwE10do_toupperEw - T _ZNKSt3__112ctype_bynameIwE11do_scan_notEjPKwS3_ - T _ZNKSt3__112ctype_bynameIwE5do_isEPKwS3_Pj - T _ZNKSt3__112ctype_bynameIwE5do_isEjw + T _ZNKSt3__112ctype_bynameIwE11do_scan_notEtPKwS3_ + T _ZNKSt3__112ctype_bynameIwE5do_isEPKwS3_Pt + T _ZNKSt3__112ctype_bynameIwE5do_isEtw T _ZNKSt3__112ctype_bynameIwE8do_widenEPKcS3_Pw T _ZNKSt3__112ctype_bynameIwE8do_widenEc T _ZNKSt3__112ctype_bynameIwE9do_narrowEPKwS3_cPc @@ -298,20 +235,20 @@ W _ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv W _ZNKSt3__113basic_ostreamIwNS_11char_traitsIwEEE6sentrycvbEv T _ZNKSt3__113random_device7entropyEv - T _ZNKSt3__114__codecvt_utf8IjE10do_unshiftER10_mbstate_tPcS4_RS4_ - T _ZNKSt3__114__codecvt_utf8IjE11do_encodingEv - T _ZNKSt3__114__codecvt_utf8IjE13do_max_lengthEv - T _ZNKSt3__114__codecvt_utf8IjE16do_always_noconvEv - T _ZNKSt3__114__codecvt_utf8IjE5do_inER10_mbstate_tPKcS5_RS5_PjS7_RS7_ - T _ZNKSt3__114__codecvt_utf8IjE6do_outER10_mbstate_tPKjS5_RS5_PcS7_RS7_ - T _ZNKSt3__114__codecvt_utf8IjE9do_lengthER10_mbstate_tPKcS5_j - T _ZNKSt3__114__codecvt_utf8ItE10do_unshiftER10_mbstate_tPcS4_RS4_ - T _ZNKSt3__114__codecvt_utf8ItE11do_encodingEv - T _ZNKSt3__114__codecvt_utf8ItE13do_max_lengthEv - T _ZNKSt3__114__codecvt_utf8ItE16do_always_noconvEv - T _ZNKSt3__114__codecvt_utf8ItE5do_inER10_mbstate_tPKcS5_RS5_PtS7_RS7_ - T _ZNKSt3__114__codecvt_utf8ItE6do_outER10_mbstate_tPKtS5_RS5_PcS7_RS7_ - T _ZNKSt3__114__codecvt_utf8ItE9do_lengthER10_mbstate_tPKcS5_j + T _ZNKSt3__114__codecvt_utf8IDiE10do_unshiftER10_mbstate_tPcS4_RS4_ + T _ZNKSt3__114__codecvt_utf8IDiE11do_encodingEv + T _ZNKSt3__114__codecvt_utf8IDiE13do_max_lengthEv + T _ZNKSt3__114__codecvt_utf8IDiE16do_always_noconvEv + T _ZNKSt3__114__codecvt_utf8IDiE5do_inER10_mbstate_tPKcS5_RS5_PDiS7_RS7_ + T _ZNKSt3__114__codecvt_utf8IDiE6do_outER10_mbstate_tPKDiS5_RS5_PcS7_RS7_ + T _ZNKSt3__114__codecvt_utf8IDiE9do_lengthER10_mbstate_tPKcS5_j + T _ZNKSt3__114__codecvt_utf8IDsE10do_unshiftER10_mbstate_tPcS4_RS4_ + T _ZNKSt3__114__codecvt_utf8IDsE11do_encodingEv + T _ZNKSt3__114__codecvt_utf8IDsE13do_max_lengthEv + T _ZNKSt3__114__codecvt_utf8IDsE16do_always_noconvEv + T _ZNKSt3__114__codecvt_utf8IDsE5do_inER10_mbstate_tPKcS5_RS5_PDsS7_RS7_ + T _ZNKSt3__114__codecvt_utf8IDsE6do_outER10_mbstate_tPKDsS5_RS5_PcS7_RS7_ + T _ZNKSt3__114__codecvt_utf8IDsE9do_lengthER10_mbstate_tPKcS5_j T _ZNKSt3__114__codecvt_utf8IwE10do_unshiftER10_mbstate_tPcS4_RS4_ T _ZNKSt3__114__codecvt_utf8IwE11do_encodingEv T _ZNKSt3__114__codecvt_utf8IwE13do_max_lengthEv @@ -326,34 +263,34 @@ T _ZNKSt3__114error_category10equivalentERKNS_10error_codeEi T _ZNKSt3__114error_category10equivalentEiRKNS_15error_conditionE T _ZNKSt3__114error_category23default_error_conditionEi - T _ZNKSt3__115__codecvt_utf16IjLb0EE10do_unshiftER10_mbstate_tPcS4_RS4_ - T _ZNKSt3__115__codecvt_utf16IjLb0EE11do_encodingEv - T _ZNKSt3__115__codecvt_utf16IjLb0EE13do_max_lengthEv - T _ZNKSt3__115__codecvt_utf16IjLb0EE16do_always_noconvEv - T _ZNKSt3__115__codecvt_utf16IjLb0EE5do_inER10_mbstate_tPKcS5_RS5_PjS7_RS7_ - T _ZNKSt3__115__codecvt_utf16IjLb0EE6do_outER10_mbstate_tPKjS5_RS5_PcS7_RS7_ - T _ZNKSt3__115__codecvt_utf16IjLb0EE9do_lengthER10_mbstate_tPKcS5_j - T _ZNKSt3__115__codecvt_utf16IjLb1EE10do_unshiftER10_mbstate_tPcS4_RS4_ - T _ZNKSt3__115__codecvt_utf16IjLb1EE11do_encodingEv - T _ZNKSt3__115__codecvt_utf16IjLb1EE13do_max_lengthEv - T _ZNKSt3__115__codecvt_utf16IjLb1EE16do_always_noconvEv - T _ZNKSt3__115__codecvt_utf16IjLb1EE5do_inER10_mbstate_tPKcS5_RS5_PjS7_RS7_ - T _ZNKSt3__115__codecvt_utf16IjLb1EE6do_outER10_mbstate_tPKjS5_RS5_PcS7_RS7_ - T _ZNKSt3__115__codecvt_utf16IjLb1EE9do_lengthER10_mbstate_tPKcS5_j - T _ZNKSt3__115__codecvt_utf16ItLb0EE10do_unshiftER10_mbstate_tPcS4_RS4_ - T _ZNKSt3__115__codecvt_utf16ItLb0EE11do_encodingEv - T _ZNKSt3__115__codecvt_utf16ItLb0EE13do_max_lengthEv - T _ZNKSt3__115__codecvt_utf16ItLb0EE16do_always_noconvEv - T _ZNKSt3__115__codecvt_utf16ItLb0EE5do_inER10_mbstate_tPKcS5_RS5_PtS7_RS7_ - T _ZNKSt3__115__codecvt_utf16ItLb0EE6do_outER10_mbstate_tPKtS5_RS5_PcS7_RS7_ - T _ZNKSt3__115__codecvt_utf16ItLb0EE9do_lengthER10_mbstate_tPKcS5_j - T _ZNKSt3__115__codecvt_utf16ItLb1EE10do_unshiftER10_mbstate_tPcS4_RS4_ - T _ZNKSt3__115__codecvt_utf16ItLb1EE11do_encodingEv - T _ZNKSt3__115__codecvt_utf16ItLb1EE13do_max_lengthEv - T _ZNKSt3__115__codecvt_utf16ItLb1EE16do_always_noconvEv - T _ZNKSt3__115__codecvt_utf16ItLb1EE5do_inER10_mbstate_tPKcS5_RS5_PtS7_RS7_ - T _ZNKSt3__115__codecvt_utf16ItLb1EE6do_outER10_mbstate_tPKtS5_RS5_PcS7_RS7_ - T _ZNKSt3__115__codecvt_utf16ItLb1EE9do_lengthER10_mbstate_tPKcS5_j + T _ZNKSt3__115__codecvt_utf16IDiLb0EE10do_unshiftER10_mbstate_tPcS4_RS4_ + T _ZNKSt3__115__codecvt_utf16IDiLb0EE11do_encodingEv + T _ZNKSt3__115__codecvt_utf16IDiLb0EE13do_max_lengthEv + T _ZNKSt3__115__codecvt_utf16IDiLb0EE16do_always_noconvEv + T _ZNKSt3__115__codecvt_utf16IDiLb0EE5do_inER10_mbstate_tPKcS5_RS5_PDiS7_RS7_ + T _ZNKSt3__115__codecvt_utf16IDiLb0EE6do_outER10_mbstate_tPKDiS5_RS5_PcS7_RS7_ + T _ZNKSt3__115__codecvt_utf16IDiLb0EE9do_lengthER10_mbstate_tPKcS5_j + T _ZNKSt3__115__codecvt_utf16IDiLb1EE10do_unshiftER10_mbstate_tPcS4_RS4_ + T _ZNKSt3__115__codecvt_utf16IDiLb1EE11do_encodingEv + T _ZNKSt3__115__codecvt_utf16IDiLb1EE13do_max_lengthEv + T _ZNKSt3__115__codecvt_utf16IDiLb1EE16do_always_noconvEv + T _ZNKSt3__115__codecvt_utf16IDiLb1EE5do_inER10_mbstate_tPKcS5_RS5_PDiS7_RS7_ + T _ZNKSt3__115__codecvt_utf16IDiLb1EE6do_outER10_mbstate_tPKDiS5_RS5_PcS7_RS7_ + T _ZNKSt3__115__codecvt_utf16IDiLb1EE9do_lengthER10_mbstate_tPKcS5_j + T _ZNKSt3__115__codecvt_utf16IDsLb0EE10do_unshiftER10_mbstate_tPcS4_RS4_ + T _ZNKSt3__115__codecvt_utf16IDsLb0EE11do_encodingEv + T _ZNKSt3__115__codecvt_utf16IDsLb0EE13do_max_lengthEv + T _ZNKSt3__115__codecvt_utf16IDsLb0EE16do_always_noconvEv + T _ZNKSt3__115__codecvt_utf16IDsLb0EE5do_inER10_mbstate_tPKcS5_RS5_PDsS7_RS7_ + T _ZNKSt3__115__codecvt_utf16IDsLb0EE6do_outER10_mbstate_tPKDsS5_RS5_PcS7_RS7_ + T _ZNKSt3__115__codecvt_utf16IDsLb0EE9do_lengthER10_mbstate_tPKcS5_j + T _ZNKSt3__115__codecvt_utf16IDsLb1EE10do_unshiftER10_mbstate_tPcS4_RS4_ + T _ZNKSt3__115__codecvt_utf16IDsLb1EE11do_encodingEv + T _ZNKSt3__115__codecvt_utf16IDsLb1EE13do_max_lengthEv + T _ZNKSt3__115__codecvt_utf16IDsLb1EE16do_always_noconvEv + T _ZNKSt3__115__codecvt_utf16IDsLb1EE5do_inER10_mbstate_tPKcS5_RS5_PDsS7_RS7_ + T _ZNKSt3__115__codecvt_utf16IDsLb1EE6do_outER10_mbstate_tPKDsS5_RS5_PcS7_RS7_ + T _ZNKSt3__115__codecvt_utf16IDsLb1EE9do_lengthER10_mbstate_tPKcS5_j T _ZNKSt3__115__codecvt_utf16IwLb0EE10do_unshiftER10_mbstate_tPcS4_RS4_ T _ZNKSt3__115__codecvt_utf16IwLb0EE11do_encodingEv T _ZNKSt3__115__codecvt_utf16IwLb0EE13do_max_lengthEv @@ -442,20 +379,20 @@ T _ZNKSt3__119__iostream_category4nameEv T _ZNKSt3__119__iostream_category7messageEi T _ZNKSt3__119__shared_weak_count13__get_deleterERKSt9type_info - T _ZNKSt3__120__codecvt_utf8_utf16IjE10do_unshiftER10_mbstate_tPcS4_RS4_ - T _ZNKSt3__120__codecvt_utf8_utf16IjE11do_encodingEv - T _ZNKSt3__120__codecvt_utf8_utf16IjE13do_max_lengthEv - T _ZNKSt3__120__codecvt_utf8_utf16IjE16do_always_noconvEv - T _ZNKSt3__120__codecvt_utf8_utf16IjE5do_inER10_mbstate_tPKcS5_RS5_PjS7_RS7_ - T _ZNKSt3__120__codecvt_utf8_utf16IjE6do_outER10_mbstate_tPKjS5_RS5_PcS7_RS7_ - T _ZNKSt3__120__codecvt_utf8_utf16IjE9do_lengthER10_mbstate_tPKcS5_j - T _ZNKSt3__120__codecvt_utf8_utf16ItE10do_unshiftER10_mbstate_tPcS4_RS4_ - T _ZNKSt3__120__codecvt_utf8_utf16ItE11do_encodingEv - T _ZNKSt3__120__codecvt_utf8_utf16ItE13do_max_lengthEv - T _ZNKSt3__120__codecvt_utf8_utf16ItE16do_always_noconvEv - T _ZNKSt3__120__codecvt_utf8_utf16ItE5do_inER10_mbstate_tPKcS5_RS5_PtS7_RS7_ - T _ZNKSt3__120__codecvt_utf8_utf16ItE6do_outER10_mbstate_tPKtS5_RS5_PcS7_RS7_ - T _ZNKSt3__120__codecvt_utf8_utf16ItE9do_lengthER10_mbstate_tPKcS5_j + T _ZNKSt3__120__codecvt_utf8_utf16IDiE10do_unshiftER10_mbstate_tPcS4_RS4_ + T _ZNKSt3__120__codecvt_utf8_utf16IDiE11do_encodingEv + T _ZNKSt3__120__codecvt_utf8_utf16IDiE13do_max_lengthEv + T _ZNKSt3__120__codecvt_utf8_utf16IDiE16do_always_noconvEv + T _ZNKSt3__120__codecvt_utf8_utf16IDiE5do_inER10_mbstate_tPKcS5_RS5_PDiS7_RS7_ + T _ZNKSt3__120__codecvt_utf8_utf16IDiE6do_outER10_mbstate_tPKDiS5_RS5_PcS7_RS7_ + T _ZNKSt3__120__codecvt_utf8_utf16IDiE9do_lengthER10_mbstate_tPKcS5_j + T _ZNKSt3__120__codecvt_utf8_utf16IDsE10do_unshiftER10_mbstate_tPcS4_RS4_ + T _ZNKSt3__120__codecvt_utf8_utf16IDsE11do_encodingEv + T _ZNKSt3__120__codecvt_utf8_utf16IDsE13do_max_lengthEv + T _ZNKSt3__120__codecvt_utf8_utf16IDsE16do_always_noconvEv + T _ZNKSt3__120__codecvt_utf8_utf16IDsE5do_inER10_mbstate_tPKcS5_RS5_PDsS7_RS7_ + T _ZNKSt3__120__codecvt_utf8_utf16IDsE6do_outER10_mbstate_tPKDsS5_RS5_PcS7_RS7_ + T _ZNKSt3__120__codecvt_utf8_utf16IDsE9do_lengthER10_mbstate_tPKcS5_j T _ZNKSt3__120__codecvt_utf8_utf16IwE10do_unshiftER10_mbstate_tPcS4_RS4_ T _ZNKSt3__120__codecvt_utf8_utf16IwE11do_encodingEv T _ZNKSt3__120__codecvt_utf8_utf16IwE13do_max_lengthEv @@ -498,14 +435,14 @@ T _ZNKSt3__15ctypeIcE8do_widenEc T _ZNKSt3__15ctypeIcE9do_narrowEPKcS3_cPc T _ZNKSt3__15ctypeIcE9do_narrowEcc - T _ZNKSt3__15ctypeIwE10do_scan_isEjPKwS3_ + T _ZNKSt3__15ctypeIwE10do_scan_isEtPKwS3_ T _ZNKSt3__15ctypeIwE10do_tolowerEPwPKw T _ZNKSt3__15ctypeIwE10do_tolowerEw T _ZNKSt3__15ctypeIwE10do_toupperEPwPKw T _ZNKSt3__15ctypeIwE10do_toupperEw - T _ZNKSt3__15ctypeIwE11do_scan_notEjPKwS3_ - T _ZNKSt3__15ctypeIwE5do_isEPKwS3_Pj - T _ZNKSt3__15ctypeIwE5do_isEjw + T _ZNKSt3__15ctypeIwE11do_scan_notEtPKwS3_ + T _ZNKSt3__15ctypeIwE5do_isEPKwS3_Pt + T _ZNKSt3__15ctypeIwE5do_isEtw T _ZNKSt3__15ctypeIwE8do_widenEPKcS3_Pw T _ZNKSt3__15ctypeIwE8do_widenEc T _ZNKSt3__15ctypeIwE9do_narrowEPKwS3_cPc @@ -520,6 +457,20 @@ C _ZNKSt3__16vectorINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hidden_allocatorIS6_EEE8max_sizeEv C _ZNKSt3__16vectorIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEE8max_sizeEv C _ZNKSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE8max_sizeEv + T _ZNKSt3__17codecvtIDic10_mbstate_tE10do_unshiftERS1_PcS4_RS4_ + T _ZNKSt3__17codecvtIDic10_mbstate_tE11do_encodingEv + T _ZNKSt3__17codecvtIDic10_mbstate_tE13do_max_lengthEv + T _ZNKSt3__17codecvtIDic10_mbstate_tE16do_always_noconvEv + T _ZNKSt3__17codecvtIDic10_mbstate_tE5do_inERS1_PKcS5_RS5_PDiS7_RS7_ + T _ZNKSt3__17codecvtIDic10_mbstate_tE6do_outERS1_PKDiS5_RS5_PcS7_RS7_ + T _ZNKSt3__17codecvtIDic10_mbstate_tE9do_lengthERS1_PKcS5_j + T _ZNKSt3__17codecvtIDsc10_mbstate_tE10do_unshiftERS1_PcS4_RS4_ + T _ZNKSt3__17codecvtIDsc10_mbstate_tE11do_encodingEv + T _ZNKSt3__17codecvtIDsc10_mbstate_tE13do_max_lengthEv + T _ZNKSt3__17codecvtIDsc10_mbstate_tE16do_always_noconvEv + T _ZNKSt3__17codecvtIDsc10_mbstate_tE5do_inERS1_PKcS5_RS5_PDsS7_RS7_ + T _ZNKSt3__17codecvtIDsc10_mbstate_tE6do_outERS1_PKDsS5_RS5_PcS7_RS7_ + T _ZNKSt3__17codecvtIDsc10_mbstate_tE9do_lengthERS1_PKcS5_j T _ZNKSt3__17codecvtIcc10_mbstate_tE10do_unshiftERS1_PcS4_RS4_ T _ZNKSt3__17codecvtIcc10_mbstate_tE11do_encodingEv T _ZNKSt3__17codecvtIcc10_mbstate_tE13do_max_lengthEv @@ -527,20 +478,6 @@ T _ZNKSt3__17codecvtIcc10_mbstate_tE5do_inERS1_PKcS5_RS5_PcS7_RS7_ T _ZNKSt3__17codecvtIcc10_mbstate_tE6do_outERS1_PKcS5_RS5_PcS7_RS7_ T _ZNKSt3__17codecvtIcc10_mbstate_tE9do_lengthERS1_PKcS5_j - T _ZNKSt3__17codecvtIjc10_mbstate_tE10do_unshiftERS1_PcS4_RS4_ - T _ZNKSt3__17codecvtIjc10_mbstate_tE11do_encodingEv - T _ZNKSt3__17codecvtIjc10_mbstate_tE13do_max_lengthEv - T _ZNKSt3__17codecvtIjc10_mbstate_tE16do_always_noconvEv - T _ZNKSt3__17codecvtIjc10_mbstate_tE5do_inERS1_PKcS5_RS5_PjS7_RS7_ - T _ZNKSt3__17codecvtIjc10_mbstate_tE6do_outERS1_PKjS5_RS5_PcS7_RS7_ - T _ZNKSt3__17codecvtIjc10_mbstate_tE9do_lengthERS1_PKcS5_j - T _ZNKSt3__17codecvtItc10_mbstate_tE10do_unshiftERS1_PcS4_RS4_ - T _ZNKSt3__17codecvtItc10_mbstate_tE11do_encodingEv - T _ZNKSt3__17codecvtItc10_mbstate_tE13do_max_lengthEv - T _ZNKSt3__17codecvtItc10_mbstate_tE16do_always_noconvEv - T _ZNKSt3__17codecvtItc10_mbstate_tE5do_inERS1_PKcS5_RS5_PtS7_RS7_ - T _ZNKSt3__17codecvtItc10_mbstate_tE6do_outERS1_PKtS5_RS5_PcS7_RS7_ - T _ZNKSt3__17codecvtItc10_mbstate_tE9do_lengthERS1_PKcS5_j T _ZNKSt3__17codecvtIwc10_mbstate_tE10do_unshiftERS1_PcS4_RS4_ T _ZNKSt3__17codecvtIwc10_mbstate_tE11do_encodingEv T _ZNKSt3__17codecvtIwc10_mbstate_tE13do_max_lengthEv @@ -767,13 +704,6 @@ W _ZNKSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE3putES4_bRNS_8ios_baseEwe W _ZNKSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_bRNS_8ios_baseEwRKNS_12basic_stringIwS3_NS_9allocatorIwEEEE W _ZNKSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_bRNS_8ios_baseEwe - T _ZNKSt8bad_cast4whatEv - T _ZNKSt9exception4whatEv - T _ZNSt10bad_typeidC1Ev - T _ZNSt10bad_typeidC2Ev - T _ZNSt10bad_typeidD0Ev - T _ZNSt10bad_typeidD1Ev - T _ZNSt10bad_typeidD2Ev T _ZNSt11logic_errorC1EPKc T _ZNSt11logic_errorC1ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE T _ZNSt11logic_errorC1ERKS_ @@ -785,19 +715,19 @@ T _ZNSt11logic_errorD2Ev T _ZNSt11logic_erroraSERKS_ T _ZNSt11range_errorD0Ev - ? _ZNSt11range_errorD1Ev + T _ZNSt11range_errorD1Ev T _ZNSt11range_errorD2Ev T _ZNSt12domain_errorD0Ev - ? _ZNSt12domain_errorD1Ev + T _ZNSt12domain_errorD1Ev T _ZNSt12domain_errorD2Ev T _ZNSt12length_errorD0Ev - ? _ZNSt12length_errorD1Ev + T _ZNSt12length_errorD1Ev T _ZNSt12length_errorD2Ev T _ZNSt12out_of_rangeD0Ev - ? _ZNSt12out_of_rangeD1Ev + T _ZNSt12out_of_rangeD1Ev T _ZNSt12out_of_rangeD2Ev T _ZNSt13bad_exceptionD0Ev - ? _ZNSt13bad_exceptionD1Ev + T _ZNSt13bad_exceptionD1Ev T _ZNSt13bad_exceptionD2Ev T _ZNSt13exception_ptrC1ERKS_ T _ZNSt13exception_ptrC2ERKS_ @@ -815,13 +745,13 @@ T _ZNSt13runtime_errorD2Ev T _ZNSt13runtime_erroraSERKS_ T _ZNSt14overflow_errorD0Ev - ? _ZNSt14overflow_errorD1Ev + T _ZNSt14overflow_errorD1Ev T _ZNSt14overflow_errorD2Ev T _ZNSt15underflow_errorD0Ev - ? _ZNSt15underflow_errorD1Ev + T _ZNSt15underflow_errorD1Ev T _ZNSt15underflow_errorD2Ev T _ZNSt16invalid_argumentD0Ev - ? _ZNSt16invalid_argumentD1Ev + T _ZNSt16invalid_argumentD1Ev T _ZNSt16invalid_argumentD2Ev T _ZNSt16nested_exceptionC1Ev T _ZNSt16nested_exceptionC2Ev @@ -836,8 +766,8 @@ C _ZNSt3__110__stdinbufIcE9__getcharEb C _ZNSt3__110__stdinbufIcE9pbackfailEi C _ZNSt3__110__stdinbufIcE9underflowEv - C _ZNSt3__110__stdinbufIcEC1EP7__sFILE - C _ZNSt3__110__stdinbufIcEC2EP7__sFILE + C _ZNSt3__110__stdinbufIcEC1EP7__sFILEP10_mbstate_t + C _ZNSt3__110__stdinbufIcEC2EP7__sFILEP10_mbstate_t C _ZNSt3__110__stdinbufIcED0Ev C _ZNSt3__110__stdinbufIcED1Ev C _ZNSt3__110__stdinbufIcED2Ev @@ -846,8 +776,8 @@ C _ZNSt3__110__stdinbufIwE9__getcharEb C _ZNSt3__110__stdinbufIwE9pbackfailEj C _ZNSt3__110__stdinbufIwE9underflowEv - C _ZNSt3__110__stdinbufIwEC1EP7__sFILE - C _ZNSt3__110__stdinbufIwEC2EP7__sFILE + C _ZNSt3__110__stdinbufIwEC1EP7__sFILEP10_mbstate_t + C _ZNSt3__110__stdinbufIwEC2EP7__sFILEP10_mbstate_t C _ZNSt3__110__stdinbufIwED0Ev C _ZNSt3__110__stdinbufIwED1Ev C _ZNSt3__110__stdinbufIwED2Ev @@ -864,29 +794,45 @@ T _ZNSt3__110__time_putD1Ev T _ZNSt3__110__time_putD2Ev D _ZNSt3__110adopt_lockE + D _ZNSt3__110ctype_base5alnumE + D _ZNSt3__110ctype_base5alphaE + D _ZNSt3__110ctype_base5blankE + D _ZNSt3__110ctype_base5cntrlE + D _ZNSt3__110ctype_base5digitE + D _ZNSt3__110ctype_base5graphE + D _ZNSt3__110ctype_base5lowerE + D _ZNSt3__110ctype_base5printE + D _ZNSt3__110ctype_base5punctE + D _ZNSt3__110ctype_base5spaceE + D _ZNSt3__110ctype_base5upperE + D _ZNSt3__110ctype_base6xdigitE D _ZNSt3__110defer_lockE T _ZNSt3__110istrstreamD0Ev T _ZNSt3__110istrstreamD1Ev T _ZNSt3__110istrstreamD2Ev W _ZNSt3__110moneypunctIcLb0EE2idE + W _ZNSt3__110moneypunctIcLb0EE4intlE W _ZNSt3__110moneypunctIcLb0EEC1Ej W _ZNSt3__110moneypunctIcLb0EEC2Ej W _ZNSt3__110moneypunctIcLb0EED0Ev W _ZNSt3__110moneypunctIcLb0EED1Ev W _ZNSt3__110moneypunctIcLb0EED2Ev W _ZNSt3__110moneypunctIcLb1EE2idE + W _ZNSt3__110moneypunctIcLb1EE4intlE W _ZNSt3__110moneypunctIcLb1EEC1Ej W _ZNSt3__110moneypunctIcLb1EEC2Ej W _ZNSt3__110moneypunctIcLb1EED0Ev W _ZNSt3__110moneypunctIcLb1EED1Ev W _ZNSt3__110moneypunctIcLb1EED2Ev W _ZNSt3__110moneypunctIwLb0EE2idE + W _ZNSt3__110moneypunctIwLb0EE4intlE W _ZNSt3__110moneypunctIwLb0EEC1Ej W _ZNSt3__110moneypunctIwLb0EEC2Ej W _ZNSt3__110moneypunctIwLb0EED0Ev W _ZNSt3__110moneypunctIwLb0EED1Ev W _ZNSt3__110moneypunctIwLb0EED2Ev W _ZNSt3__110moneypunctIwLb1EE2idE + W _ZNSt3__110moneypunctIwLb1EE4intlE W _ZNSt3__110moneypunctIwLb1EEC1Ej W _ZNSt3__110moneypunctIwLb1EEC2Ej W _ZNSt3__110moneypunctIwLb1EED0Ev @@ -904,10 +850,6 @@ T _ZNSt3__110to_wstringEm T _ZNSt3__110to_wstringEx T _ZNSt3__110to_wstringEy - T _ZNSt3__110unique_ptrINS_6locale5facetENS_12_GLOBAL__N_17releaseEEC1EPS2_ - t _ZNSt3__110unique_ptrINS_6locale5facetENS_12_GLOBAL__N_17releaseEEC2EPS2_ - T _ZNSt3__110unique_ptrINS_6locale5facetENS_12_GLOBAL__N_17releaseEED1Ev - t _ZNSt3__110unique_ptrINS_6locale5facetENS_12_GLOBAL__N_17releaseEED2Ev T _ZNSt3__111__call_onceERVmPvPFvS2_E T _ZNSt3__111__libcpp_db10__insert_cEPv T _ZNSt3__111__libcpp_db10__insert_iEPv @@ -940,16 +882,16 @@ C _ZNSt3__111__stdoutbufIcE4syncEv C _ZNSt3__111__stdoutbufIcE5imbueERKNS_6localeE C _ZNSt3__111__stdoutbufIcE8overflowEi - C _ZNSt3__111__stdoutbufIcEC1EP7__sFILE - C _ZNSt3__111__stdoutbufIcEC2EP7__sFILE + C _ZNSt3__111__stdoutbufIcEC1EP7__sFILEP10_mbstate_t + C _ZNSt3__111__stdoutbufIcEC2EP7__sFILEP10_mbstate_t C _ZNSt3__111__stdoutbufIcED0Ev C _ZNSt3__111__stdoutbufIcED1Ev C _ZNSt3__111__stdoutbufIcED2Ev C _ZNSt3__111__stdoutbufIwE4syncEv C _ZNSt3__111__stdoutbufIwE5imbueERKNS_6localeE C _ZNSt3__111__stdoutbufIwE8overflowEj - C _ZNSt3__111__stdoutbufIwEC1EP7__sFILE - C _ZNSt3__111__stdoutbufIwEC2EP7__sFILE + C _ZNSt3__111__stdoutbufIwEC1EP7__sFILEP10_mbstate_t + C _ZNSt3__111__stdoutbufIwEC2EP7__sFILEP10_mbstate_t C _ZNSt3__111__stdoutbufIwED0Ev C _ZNSt3__111__stdoutbufIwED1Ev C _ZNSt3__111__stdoutbufIwED2Ev @@ -968,54 +910,16 @@ T _ZNSt3__111timed_mutexD2Ev D _ZNSt3__111try_to_lockE C _ZNSt3__111unique_lockINS_5mutexEE6unlockEv - t _ZNSt3__112_GLOBAL__N_110use_strcmpclERKNS0_10classnamesEPKc - t _ZNSt3__112_GLOBAL__N_110use_strcmpclERKNS0_14collationnamesEPKc - T _ZNSt3__112_GLOBAL__N_111__fake_bindC1EMNS_6locale2idEFvvEPS3_ - t _ZNSt3__112_GLOBAL__N_111__fake_bindC2EMNS_6locale2idEFvvEPS3_ - t _ZNSt3__112_GLOBAL__N_13mutEv - t _ZNSt3__112_GLOBAL__N_14makeINS_10moneypunctIcLb0EEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_10moneypunctIcLb1EEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_10moneypunctIwLb0EEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_10moneypunctIwLb1EEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_5ctypeIcEEPjbiEERT_T0_T1_T2_ - t _ZNSt3__112_GLOBAL__N_14makeINS_5ctypeIwEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_6locale5__impEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_7codecvtIcc10_mbstate_tEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_7codecvtIjc10_mbstate_tEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_7codecvtItc10_mbstate_tEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_7codecvtIwc10_mbstate_tEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_7collateIcEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_7collateIwEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_7num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_7num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_7num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_7num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_8messagesIcEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_8messagesIwEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_8numpunctIcEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_8numpunctIwEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_8time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_8time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_8time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_9money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_9money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_9money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_14makeINS_9money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEEiEERT_T0_ - t _ZNSt3__112_GLOBAL__N_17releaseclEPNS_6locale5facetE - t _ZNSt3__112_GLOBAL__N_19decrementIlEET_RS2_ - t _ZNSt3__112_GLOBAL__N_19incrementIlEET_RS2_ - d _ZNSt3__112_GLOBAL__N_1L10ClassNamesE - d _ZNSt3__112_GLOBAL__N_1L12collatenamesE - d _ZNSt3__112_GLOBAL__N_1L12small_primesE - d _ZNSt3__112_GLOBAL__N_1L7indicesE C _ZNSt3__112__asprintf_lEPPcPvPKcz C _ZNSt3__112__do_messageC2Ev C _ZNSt3__112__do_messageD0Ev C _ZNSt3__112__do_messageD1Ev C _ZNSt3__112__do_messageD2Ev T _ZNSt3__112__do_nothingEPv + T _ZNSt3__112__get_sp_mutEPKv T _ZNSt3__112__next_primeEj + C _ZNSt3__112__rotate_gcdINS_11__wrap_iterIPcEEEET_S4_S4_S4_ + C _ZNSt3__112__rotate_gcdINS_11__wrap_iterIPwEEEET_S4_S4_S4_ D _ZNSt3__112__rs_default4__c_E T _ZNSt3__112__rs_defaultC1ERKS0_ T _ZNSt3__112__rs_defaultC1Ev @@ -1034,6 +938,8 @@ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE12__swap_allocERS4_S6_NS_17integral_constantIbLb0EEE W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE12__swap_allocERS4_S6_NS_17integral_constantIbLb1EEE W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__move_assignERS5_NS_17integral_constantIbLb0EEE + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__move_assignERS5_NS_17integral_constantIbLb1EEE W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13shrink_to_fitEv W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__erase_to_endEj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEj @@ -1072,13 +978,17 @@ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKcj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendERKS5_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendERKS5_jj + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendESt16initializer_listIcE W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEjc C _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueERS5_E4typeES9_S9_ + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEOS5_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKc W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKcj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignERKS5_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignERKS5_jj + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignESt16initializer_listIcE W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEjc + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertENS_11__wrap_iterIPKcEESt16initializer_listIcE W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertENS_11__wrap_iterIPKcEEc W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertENS_11__wrap_iterIPKcEEjc W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEjPKc @@ -1086,6 +996,7 @@ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEjRKS5_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEjRKS5_jj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEjjc + C _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertIPKcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueENS_11__wrap_iterIPcEEE4typeENSB_IS8_EESA_SA_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6rbeginEv W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEjc @@ -1093,16 +1004,20 @@ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceENS_11__wrap_iterIPKcEES9_RKS5_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceENS_11__wrap_iterIPKcEES9_S8_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceENS_11__wrap_iterIPKcEES9_S8_j + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceENS_11__wrap_iterIPKcEES9_St16initializer_listIcE W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceENS_11__wrap_iterIPKcEES9_jc W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjPKc W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjPKcj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjRKS5_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjRKS5_jj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjjc + C _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceIPKcEENS_9enable_ifIXsr19__is_input_iteratorIT_EE5valueERS5_E4typeENS_11__wrap_iterIS8_EESF_SA_SA_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7reserveEj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8pop_backEv W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__grow_byEjjjjjj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1EOS5_ + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1EOS5_RKS4_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1EPKc W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1EPKcRKS4_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1EPKcj @@ -1111,9 +1026,13 @@ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_RKS4_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_jjRKS4_ + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ESt16initializer_listIcE + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ESt16initializer_listIcERKS4_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ejc W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1EjcRKS4_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2EOS5_ + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2EOS5_RKS4_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2EPKc W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2EPKcRKS4_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2EPKcj @@ -1122,17 +1041,22 @@ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS5_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS5_RKS4_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS5_jjRKS4_ + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ESt16initializer_listIcE + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ESt16initializer_listIcERKS4_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ejc W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2EjcRKS4_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEOS5_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEPKc W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSERKS5_ + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSESt16initializer_listIcE W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEc W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEixEj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEpLEPKc W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEpLERKS5_ + W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEpLESt16initializer_listIcE W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEpLEc W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE10__set_sizeEj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE11__recommendEj @@ -1140,6 +1064,8 @@ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE12__swap_allocERS4_S6_NS_17integral_constantIbLb0EEE W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE12__swap_allocERS4_S6_NS_17integral_constantIbLb1EEE W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE13__get_pointerEv + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE13__move_assignERS5_NS_17integral_constantIbLb0EEE + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE13__move_assignERS5_NS_17integral_constantIbLb1EEE W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE13shrink_to_fitEv W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE14__erase_to_endEj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE14__set_long_capEj @@ -1178,14 +1104,18 @@ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendEPKwj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendERKS5_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendERKS5_jj + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendESt16initializer_listIwE W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendEjw C _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendIPwEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueERS5_E4typeES9_S9_ + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignEOS5_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignEPKw W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignEPKwj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignERKS5_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignERKS5_jj + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignESt16initializer_listIwE W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignEjw C _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignIPwEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueERS5_E4typeES9_S9_ + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertENS_11__wrap_iterIPKwEESt16initializer_listIwE W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertENS_11__wrap_iterIPKwEEjw W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertENS_11__wrap_iterIPKwEEw W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertEjPKw @@ -1193,6 +1123,7 @@ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertEjRKS5_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertEjRKS5_jj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertEjjw + C _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertIPKwEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueENS_11__wrap_iterIPwEEE4typeENSB_IS8_EESA_SA_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6rbeginEv W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6resizeEj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6resizeEjw @@ -1200,16 +1131,20 @@ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceENS_11__wrap_iterIPKwEES9_RKS5_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceENS_11__wrap_iterIPKwEES9_S8_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceENS_11__wrap_iterIPKwEES9_S8_j + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceENS_11__wrap_iterIPKwEES9_St16initializer_listIwE W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceENS_11__wrap_iterIPKwEES9_jw W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjPKw W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjPKwj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjRKS5_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjRKS5_jj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjjw + C _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceIPKwEENS_9enable_ifIXsr19__is_input_iteratorIT_EE5valueERS5_E4typeENS_11__wrap_iterIS8_EESF_SA_SA_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7reserveEj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE8pop_backEv W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE9__grow_byEjjjjjj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE9push_backEw + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1EOS5_ + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1EOS5_RKS4_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1EPKw W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1EPKwRKS4_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1EPKwj @@ -1218,9 +1153,13 @@ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1ERKS5_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1ERKS5_RKS4_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1ERKS5_jjRKS4_ + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1ESt16initializer_listIwE + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1ESt16initializer_listIwERKS4_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1Ejw W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1EjwRKS4_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1Ev + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2EOS5_ + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2EOS5_RKS4_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2EPKw W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2EPKwRKS4_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2EPKwj @@ -1229,17 +1168,22 @@ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2ERKS5_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2ERKS5_RKS4_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2ERKS5_jjRKS4_ + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2ESt16initializer_listIwE + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2ESt16initializer_listIwERKS4_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2Ejw W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2EjwRKS4_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2Ev W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEED1Ev W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEED2Ev + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEaSEOS5_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEaSEPKw W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEaSERKS5_ + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEaSESt16initializer_listIwE W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEaSEw W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEixEj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEpLEPKw W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEpLERKS5_ + W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEpLESt16initializer_listIwE W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEpLEw T _ZNSt3__112ctype_bynameIcEC1EPKcj T _ZNSt3__112ctype_bynameIcEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj @@ -1316,9 +1260,9 @@ T _ZNSt3__112system_errorD0Ev T _ZNSt3__112system_errorD1Ev T _ZNSt3__112system_errorD2Ev - t _ZNSt3__113__lower_boundIRNS_12_GLOBAL__N_110use_strcmpEPKNS1_10classnamesEPKcEET0_S9_S9_RKT1_T_ - t _ZNSt3__113__lower_boundIRNS_12_GLOBAL__N_110use_strcmpEPKNS1_14collationnamesEPKcEET0_S9_S9_RKT1_T_ C _ZNSt3__113__lower_boundIRNS_6__lessIjjEEPKjjEET0_S6_S6_RKT1_T_ + C _ZNSt3__113__rotate_leftINS_11__wrap_iterIPcEEEET_S4_S4_ + C _ZNSt3__113__rotate_leftINS_11__wrap_iterIPwEEEET_S4_S4_ C _ZNSt3__113__vector_baseINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hidden_allocatorIS6_EEED2Ev C _ZNSt3__113__vector_baseIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEED2Ev C _ZNSt3__113__vector_baseIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEED2Ev @@ -1344,11 +1288,14 @@ W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE7getlineEPcic W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE7putbackEc W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE8readsomeEPci + W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC1EOS3_ W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC1EPNS_15basic_streambufIcS2_EE + W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EOS3_ W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev + W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEaSEOS3_ W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsEPFRNS_8ios_baseES5_E W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsEPFRNS_9basic_iosIcS2_EES6_E W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsEPFRS3_S4_E @@ -1387,11 +1334,14 @@ W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE7getlineEPwiw W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE7putbackEw W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE8readsomeEPwi + W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEEC1EOS3_ W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEEC1EPNS_15basic_streambufIwS2_EE + W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEEC2EOS3_ W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEEC2EPNS_15basic_streambufIwS2_EE W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEED0Ev W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEED1Ev W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEED2Ev + W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEEaSEOS3_ W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsEPFRNS_8ios_baseES5_E W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsEPFRNS_9basic_iosIwS2_EES6_E W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsEPFRS3_S4_E @@ -1420,13 +1370,16 @@ W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC2ERS3_ W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD2Ev + W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC1EOS3_ W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC1EPNS_15basic_streambufIcS2_EE W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC1Ev + W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2EOS3_ W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED2Ev + W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEaSEOS3_ W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRNS_8ios_baseES5_E W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRNS_9basic_iosIcS2_EES6_E W _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRS3_S4_E @@ -1455,13 +1408,16 @@ W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE6sentryC2ERS3_ W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE6sentryD1Ev W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE6sentryD2Ev + W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEEC1EOS3_ W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEEC1EPNS_15basic_streambufIwS2_EE W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEEC1Ev + W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEEC2EOS3_ W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEEC2EPNS_15basic_streambufIwS2_EE W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEEC2Ev W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEED0Ev W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEED1Ev W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEED2Ev + W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEEaSEOS3_ W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEPFRNS_8ios_baseES5_E W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEPFRNS_9basic_iosIwS2_EES6_E W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEPFRS3_S4_E @@ -1489,12 +1445,12 @@ T _ZNSt3__113shared_futureIvED1Ev T _ZNSt3__113shared_futureIvED2Ev T _ZNSt3__113shared_futureIvEaSERKS1_ - C _ZNSt3__114__codecvt_utf8IjED0Ev - C _ZNSt3__114__codecvt_utf8IjED1Ev - C _ZNSt3__114__codecvt_utf8IjED2Ev - C _ZNSt3__114__codecvt_utf8ItED0Ev - C _ZNSt3__114__codecvt_utf8ItED1Ev - C _ZNSt3__114__codecvt_utf8ItED2Ev + C _ZNSt3__114__codecvt_utf8IDiED0Ev + C _ZNSt3__114__codecvt_utf8IDiED1Ev + C _ZNSt3__114__codecvt_utf8IDiED2Ev + C _ZNSt3__114__codecvt_utf8IDsED0Ev + C _ZNSt3__114__codecvt_utf8IDsED1Ev + C _ZNSt3__114__codecvt_utf8IDsED2Ev C _ZNSt3__114__codecvt_utf8IwED0Ev C _ZNSt3__114__codecvt_utf8IwED1Ev C _ZNSt3__114__codecvt_utf8IwED2Ev @@ -1504,10 +1460,10 @@ T _ZNSt3__114__num_put_base12__format_intEPcPKcbj T _ZNSt3__114__num_put_base14__format_floatEPcPKcj T _ZNSt3__114__num_put_base18__identify_paddingEPcS1_RKNS_8ios_baseE + C _ZNSt3__114__rotate_rightINS_11__wrap_iterIPcEEEET_S4_S4_ + C _ZNSt3__114__rotate_rightINS_11__wrap_iterIPwEEEET_S4_S4_ C _ZNSt3__114__scan_keywordINS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEPKNS_12basic_stringIcS3_NS_9allocatorIcEEEENS_5ctypeIcEEEET0_RT_SE_SD_SD_RKT1_Rjb - C _ZNSt3__114__scan_keywordINS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEPNS_12basic_stringIcS3_NS_9allocatorIcEEEENS_5ctypeIcEEEET0_RT_SD_SC_SC_RKT1_Rjb C _ZNSt3__114__scan_keywordINS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEPKNS_12basic_stringIwS3_NS_9allocatorIwEEEENS_5ctypeIwEEEET0_RT_SE_SD_SD_RKT1_Rjb - C _ZNSt3__114__scan_keywordINS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEPNS_12basic_stringIwS3_NS_9allocatorIwEEEENS_5ctypeIwEEEET0_RT_SD_SC_SC_RKT1_Rjb C _ZNSt3__114__scan_keywordIPcPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_5ctypeIcEEEET0_RT_SC_SB_SB_RKT1_Rjb C _ZNSt3__114__scan_keywordIPwPNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEENS_5ctypeIwEEEET0_RT_SC_SB_SB_RKT1_Rjb T _ZNSt3__114__shared_count12__add_sharedEv @@ -1515,31 +1471,42 @@ T _ZNSt3__114__shared_countD0Ev T _ZNSt3__114__shared_countD1Ev T _ZNSt3__114__shared_countD2Ev - C _ZNSt3__114__split_bufferINS_4pairIPNS_18condition_variableEPNS_5mutexEEERNS_18__hidden_allocatorIS6_EEE10push_frontERKS6_ - C _ZNSt3__114__split_bufferINS_4pairIPNS_18condition_variableEPNS_5mutexEEERNS_18__hidden_allocatorIS6_EEE18__construct_at_endINS_13move_iteratorIPS6_EEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESG_SG_ C _ZNSt3__114__split_bufferINS_4pairIPNS_18condition_variableEPNS_5mutexEEERNS_18__hidden_allocatorIS6_EEEC1EjjS9_ C _ZNSt3__114__split_bufferINS_4pairIPNS_18condition_variableEPNS_5mutexEEERNS_18__hidden_allocatorIS6_EEEC2EjjS9_ C _ZNSt3__114__split_bufferINS_4pairIPNS_18condition_variableEPNS_5mutexEEERNS_18__hidden_allocatorIS6_EEED1Ev C _ZNSt3__114__split_bufferINS_4pairIPNS_18condition_variableEPNS_5mutexEEERNS_18__hidden_allocatorIS6_EEED2Ev - C _ZNSt3__114__split_bufferIPNS_17__assoc_sub_stateERNS_18__hidden_allocatorIS2_EEE10push_frontERKS2_ - C _ZNSt3__114__split_bufferIPNS_17__assoc_sub_stateERNS_18__hidden_allocatorIS2_EEE18__construct_at_endINS_13move_iteratorIPS2_EEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESC_SC_ C _ZNSt3__114__split_bufferIPNS_17__assoc_sub_stateERNS_18__hidden_allocatorIS2_EEEC1EjjS5_ C _ZNSt3__114__split_bufferIPNS_17__assoc_sub_stateERNS_18__hidden_allocatorIS2_EEEC2EjjS5_ C _ZNSt3__114__split_bufferIPNS_17__assoc_sub_stateERNS_18__hidden_allocatorIS2_EEED1Ev C _ZNSt3__114__split_bufferIPNS_17__assoc_sub_stateERNS_18__hidden_allocatorIS2_EEED2Ev - C _ZNSt3__114__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lj28EEEE10push_frontERKS3_ C _ZNSt3__114__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lj28EEEE18__construct_at_endEj - C _ZNSt3__114__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lj28EEEE18__construct_at_endINS_13move_iteratorIPS3_EEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESD_SD_ C _ZNSt3__114__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lj28EEEEC1EjjS6_ C _ZNSt3__114__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lj28EEEEC2EjjS6_ C _ZNSt3__114__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lj28EEEED1Ev C _ZNSt3__114__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lj28EEEED2Ev W _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEE4swapERS3_ + W _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC1EOS3_ W _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC1EPNS_15basic_streambufIcS2_EE + W _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EOS3_ W _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE W _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev W _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev W _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev + W _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEaSEOS3_ + W _ZNSt3__114codecvt_bynameIDic10_mbstate_tEC1EPKcj + W _ZNSt3__114codecvt_bynameIDic10_mbstate_tEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj + W _ZNSt3__114codecvt_bynameIDic10_mbstate_tEC2EPKcj + W _ZNSt3__114codecvt_bynameIDic10_mbstate_tEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj + W _ZNSt3__114codecvt_bynameIDic10_mbstate_tED0Ev + W _ZNSt3__114codecvt_bynameIDic10_mbstate_tED1Ev + W _ZNSt3__114codecvt_bynameIDic10_mbstate_tED2Ev + W _ZNSt3__114codecvt_bynameIDsc10_mbstate_tEC1EPKcj + W _ZNSt3__114codecvt_bynameIDsc10_mbstate_tEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj + W _ZNSt3__114codecvt_bynameIDsc10_mbstate_tEC2EPKcj + W _ZNSt3__114codecvt_bynameIDsc10_mbstate_tEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj + W _ZNSt3__114codecvt_bynameIDsc10_mbstate_tED0Ev + W _ZNSt3__114codecvt_bynameIDsc10_mbstate_tED1Ev + W _ZNSt3__114codecvt_bynameIDsc10_mbstate_tED2Ev W _ZNSt3__114codecvt_bynameIcc10_mbstate_tEC1EPKcj W _ZNSt3__114codecvt_bynameIcc10_mbstate_tEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj W _ZNSt3__114codecvt_bynameIcc10_mbstate_tEC2EPKcj @@ -1547,20 +1514,6 @@ W _ZNSt3__114codecvt_bynameIcc10_mbstate_tED0Ev W _ZNSt3__114codecvt_bynameIcc10_mbstate_tED1Ev W _ZNSt3__114codecvt_bynameIcc10_mbstate_tED2Ev - W _ZNSt3__114codecvt_bynameIjc10_mbstate_tEC1EPKcj - W _ZNSt3__114codecvt_bynameIjc10_mbstate_tEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj - W _ZNSt3__114codecvt_bynameIjc10_mbstate_tEC2EPKcj - W _ZNSt3__114codecvt_bynameIjc10_mbstate_tEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj - W _ZNSt3__114codecvt_bynameIjc10_mbstate_tED0Ev - W _ZNSt3__114codecvt_bynameIjc10_mbstate_tED1Ev - W _ZNSt3__114codecvt_bynameIjc10_mbstate_tED2Ev - W _ZNSt3__114codecvt_bynameItc10_mbstate_tEC1EPKcj - W _ZNSt3__114codecvt_bynameItc10_mbstate_tEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj - W _ZNSt3__114codecvt_bynameItc10_mbstate_tEC2EPKcj - W _ZNSt3__114codecvt_bynameItc10_mbstate_tEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj - W _ZNSt3__114codecvt_bynameItc10_mbstate_tED0Ev - W _ZNSt3__114codecvt_bynameItc10_mbstate_tED1Ev - W _ZNSt3__114codecvt_bynameItc10_mbstate_tED2Ev W _ZNSt3__114codecvt_bynameIwc10_mbstate_tEC1EPKcj W _ZNSt3__114codecvt_bynameIwc10_mbstate_tEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj W _ZNSt3__114codecvt_bynameIwc10_mbstate_tEC2EPKcj @@ -1586,18 +1539,18 @@ T _ZNSt3__114error_categoryD0Ev T _ZNSt3__114error_categoryD1Ev T _ZNSt3__114error_categoryD2Ev - C _ZNSt3__115__codecvt_utf16IjLb0EED0Ev - C _ZNSt3__115__codecvt_utf16IjLb0EED1Ev - C _ZNSt3__115__codecvt_utf16IjLb0EED2Ev - C _ZNSt3__115__codecvt_utf16IjLb1EED0Ev - C _ZNSt3__115__codecvt_utf16IjLb1EED1Ev - C _ZNSt3__115__codecvt_utf16IjLb1EED2Ev - C _ZNSt3__115__codecvt_utf16ItLb0EED0Ev - C _ZNSt3__115__codecvt_utf16ItLb0EED1Ev - C _ZNSt3__115__codecvt_utf16ItLb0EED2Ev - C _ZNSt3__115__codecvt_utf16ItLb1EED0Ev - C _ZNSt3__115__codecvt_utf16ItLb1EED1Ev - C _ZNSt3__115__codecvt_utf16ItLb1EED2Ev + C _ZNSt3__115__codecvt_utf16IDiLb0EED0Ev + C _ZNSt3__115__codecvt_utf16IDiLb0EED1Ev + C _ZNSt3__115__codecvt_utf16IDiLb0EED2Ev + C _ZNSt3__115__codecvt_utf16IDiLb1EED0Ev + C _ZNSt3__115__codecvt_utf16IDiLb1EED1Ev + C _ZNSt3__115__codecvt_utf16IDiLb1EED2Ev + C _ZNSt3__115__codecvt_utf16IDsLb0EED0Ev + C _ZNSt3__115__codecvt_utf16IDsLb0EED1Ev + C _ZNSt3__115__codecvt_utf16IDsLb0EED2Ev + C _ZNSt3__115__codecvt_utf16IDsLb1EED0Ev + C _ZNSt3__115__codecvt_utf16IDsLb1EED1Ev + C _ZNSt3__115__codecvt_utf16IDsLb1EED2Ev C _ZNSt3__115__codecvt_utf16IwLb0EED0Ev C _ZNSt3__115__codecvt_utf16IwLb0EED1Ev C _ZNSt3__115__codecvt_utf16IwLb0EED2Ev @@ -1727,7 +1680,7 @@ T _ZNSt3__115numpunct_bynameIcEC2EPKcj T _ZNSt3__115numpunct_bynameIcEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj T _ZNSt3__115numpunct_bynameIcED0Ev - ? _ZNSt3__115numpunct_bynameIcED1Ev + T _ZNSt3__115numpunct_bynameIcED1Ev T _ZNSt3__115numpunct_bynameIcED2Ev T _ZNSt3__115numpunct_bynameIwE6__initEPKc T _ZNSt3__115numpunct_bynameIwEC1EPKcj @@ -1735,7 +1688,7 @@ T _ZNSt3__115numpunct_bynameIwEC2EPKcj T _ZNSt3__115numpunct_bynameIwEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj T _ZNSt3__115numpunct_bynameIwED0Ev - ? _ZNSt3__115numpunct_bynameIwED1Ev + T _ZNSt3__115numpunct_bynameIwED1Ev T _ZNSt3__115numpunct_bynameIwED2Ev T _ZNSt3__115recursive_mutex4lockEv T _ZNSt3__115recursive_mutex6unlockEv @@ -1775,13 +1728,13 @@ W _ZNSt3__115time_put_bynameIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEED2Ev T _ZNSt3__116__check_groupingERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjS8_Rj T _ZNSt3__116__narrow_to_utf8ILj16EED0Ev - ? _ZNSt3__116__narrow_to_utf8ILj16EED1Ev - ? _ZNSt3__116__narrow_to_utf8ILj16EED2Ev + T _ZNSt3__116__narrow_to_utf8ILj16EED1Ev + T _ZNSt3__116__narrow_to_utf8ILj16EED2Ev T _ZNSt3__116__narrow_to_utf8ILj32EED0Ev - ? _ZNSt3__116__narrow_to_utf8ILj32EED1Ev - ? _ZNSt3__116__narrow_to_utf8ILj32EED2Ev - C _ZNSt3__116__pad_and_outputIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEET0_S5_PKT_S8_S8_RNS_8ios_baseES6_ - C _ZNSt3__116__pad_and_outputIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEET0_S5_PKT_S8_S8_RNS_8ios_baseES6_ + T _ZNSt3__116__narrow_to_utf8ILj32EED1Ev + T _ZNSt3__116__narrow_to_utf8ILj32EED2Ev + C _ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_ + C _ZNSt3__116__pad_and_outputIwNS_11char_traitsIwEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_ T _ZNSt3__116generic_categoryEv T _ZNSt3__117__assoc_sub_state10__sub_waitERNS_11unique_lockINS_5mutexEEE T _ZNSt3__117__assoc_sub_state12__make_readyEv @@ -1796,17 +1749,12 @@ C _ZNSt3__117__assoc_sub_stateD0Ev C _ZNSt3__117__assoc_sub_stateD1Ev C _ZNSt3__117__assoc_sub_stateD2Ev - T _ZNSt3__117__call_once_paramINS_12_GLOBAL__N_111__fake_bindEEC1ERKS2_ - t _ZNSt3__117__call_once_paramINS_12_GLOBAL__N_111__fake_bindEEC2ERKS2_ - t _ZNSt3__117__call_once_proxyINS_12_GLOBAL__N_111__fake_bindEEEvPv - T _ZNSt3__117__compressed_pairIPNS_6locale5facetENS_12_GLOBAL__N_17releaseEEC1ES3_i - t _ZNSt3__117__compressed_pairIPNS_6locale5facetENS_12_GLOBAL__N_17releaseEEC2ES3_i T _ZNSt3__117__widen_from_utf8ILj16EED0Ev - ? _ZNSt3__117__widen_from_utf8ILj16EED1Ev - ? _ZNSt3__117__widen_from_utf8ILj16EED2Ev + T _ZNSt3__117__widen_from_utf8ILj16EED1Ev + T _ZNSt3__117__widen_from_utf8ILj16EED2Ev T _ZNSt3__117__widen_from_utf8ILj32EED0Ev - ? _ZNSt3__117__widen_from_utf8ILj32EED1Ev - ? _ZNSt3__117__widen_from_utf8ILj32EED2Ev + T _ZNSt3__117__widen_from_utf8ILj32EED1Ev + T _ZNSt3__117__widen_from_utf8ILj32EED2Ev T _ZNSt3__117declare_reachableEPv T _ZNSt3__117iostream_categoryEv T _ZNSt3__117moneypunct_bynameIcLb0EE4initEPKc @@ -1893,7 +1841,7 @@ T _ZNSt3__119__shared_weak_count16__release_sharedEv T _ZNSt3__119__shared_weak_count4lockEv T _ZNSt3__119__shared_weak_countD0Ev - ? _ZNSt3__119__shared_weak_countD1Ev + T _ZNSt3__119__shared_weak_countD1Ev T _ZNSt3__119__shared_weak_countD2Ev D _ZNSt3__119__start_std_streamsE T _ZNSt3__119__thread_local_dataEv @@ -1905,12 +1853,12 @@ T _ZNSt3__119__thread_struct_impD2Ev T _ZNSt3__119declare_no_pointersEPcj D _ZNSt3__119piecewise_constructE - C _ZNSt3__120__codecvt_utf8_utf16IjED0Ev - C _ZNSt3__120__codecvt_utf8_utf16IjED1Ev - C _ZNSt3__120__codecvt_utf8_utf16IjED2Ev - C _ZNSt3__120__codecvt_utf8_utf16ItED0Ev - C _ZNSt3__120__codecvt_utf8_utf16ItED1Ev - C _ZNSt3__120__codecvt_utf8_utf16ItED2Ev + C _ZNSt3__120__codecvt_utf8_utf16IDiED0Ev + C _ZNSt3__120__codecvt_utf8_utf16IDiED1Ev + C _ZNSt3__120__codecvt_utf8_utf16IDiED2Ev + C _ZNSt3__120__codecvt_utf8_utf16IDsED0Ev + C _ZNSt3__120__codecvt_utf8_utf16IDsED1Ev + C _ZNSt3__120__codecvt_utf8_utf16IDsED2Ev C _ZNSt3__120__codecvt_utf8_utf16IwED0Ev C _ZNSt3__120__codecvt_utf8_utf16IwED1Ev C _ZNSt3__120__codecvt_utf8_utf16IwED2Ev @@ -1924,6 +1872,7 @@ C _ZNSt3__120__time_get_c_storageIwEC2Ev W _ZNSt3__120__vector_base_commonILb1EEC1Ev W _ZNSt3__120__vector_base_commonILb1EEC2Ev + C _ZNSt3__121__murmur2_or_cityhashIjLj32EEclEPKvj C _ZNSt3__121__thread_specific_ptrINS_15__thread_structEE16__at_thread_exitEPv C _ZNSt3__121__thread_specific_ptrINS_15__thread_structEEC1Ev C _ZNSt3__121__thread_specific_ptrINS_15__thread_structEEC2Ev @@ -1997,14 +1946,14 @@ T _ZNSt3__15ctypeIcE21__classic_lower_tableEv T _ZNSt3__15ctypeIcE21__classic_upper_tableEv D _ZNSt3__15ctypeIcE2idE - T _ZNSt3__15ctypeIcEC1EPKjbj - T _ZNSt3__15ctypeIcEC2EPKjbj + T _ZNSt3__15ctypeIcEC1EPKtbj + T _ZNSt3__15ctypeIcEC2EPKtbj T _ZNSt3__15ctypeIcED0Ev T _ZNSt3__15ctypeIcED1Ev T _ZNSt3__15ctypeIcED2Ev D _ZNSt3__15ctypeIwE2idE T _ZNSt3__15ctypeIwED0Ev - ? _ZNSt3__15ctypeIwED1Ev + T _ZNSt3__15ctypeIwED1Ev T _ZNSt3__15ctypeIwED2Ev T _ZNSt3__15mutex4lockEv T _ZNSt3__15mutex6unlockEv @@ -2037,8 +1986,10 @@ W _ZNSt3__16__sortIRNS_6__lessIxxEEPxEEvT0_S5_T_ W _ZNSt3__16__sortIRNS_6__lessIyyEEPyEEvT0_S5_T_ T _ZNSt3__16chrono12steady_clock3nowEv + D _ZNSt3__16chrono12steady_clock9is_steadyE T _ZNSt3__16chrono12system_clock11from_time_tEl T _ZNSt3__16chrono12system_clock3nowEv + D _ZNSt3__16chrono12system_clock9is_steadyE T _ZNSt3__16chrono12system_clock9to_time_tERKNS0_10time_pointIS1_NS0_8durationIxNS_5ratioILx1ELx1000000EEEEEEE T _ZNSt3__16futureIvE3getEv T _ZNSt3__16futureIvEC1EPNS_17__assoc_sub_stateE @@ -2050,6 +2001,9 @@ T _ZNSt3__16locale2id5__getEv T _ZNSt3__16locale2id6__initEv D _ZNSt3__16locale2id9__next_idE + D _ZNSt3__16locale3allE + D _ZNSt3__16locale4noneE + D _ZNSt3__16locale4timeE T _ZNSt3__16locale5__imp11make_globalEv C _ZNSt3__16locale5__imp12install_fromINS_10moneypunctIcLb0EEEEEvRKS1_ C _ZNSt3__16locale5__imp12install_fromINS_10moneypunctIcLb1EEEEEvRKS1_ @@ -2057,9 +2011,9 @@ C _ZNSt3__16locale5__imp12install_fromINS_10moneypunctIwLb1EEEEEvRKS1_ C _ZNSt3__16locale5__imp12install_fromINS_5ctypeIcEEEEvRKS1_ C _ZNSt3__16locale5__imp12install_fromINS_5ctypeIwEEEEvRKS1_ + C _ZNSt3__16locale5__imp12install_fromINS_7codecvtIDic10_mbstate_tEEEEvRKS1_ + C _ZNSt3__16locale5__imp12install_fromINS_7codecvtIDsc10_mbstate_tEEEEvRKS1_ C _ZNSt3__16locale5__imp12install_fromINS_7codecvtIcc10_mbstate_tEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_7codecvtIjc10_mbstate_tEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_7codecvtItc10_mbstate_tEEEEvRKS1_ C _ZNSt3__16locale5__imp12install_fromINS_7codecvtIwc10_mbstate_tEEEEvRKS1_ C _ZNSt3__16locale5__imp12install_fromINS_7collateIcEEEEvRKS1_ C _ZNSt3__16locale5__imp12install_fromINS_7collateIwEEEEvRKS1_ @@ -2087,9 +2041,9 @@ C _ZNSt3__16locale5__imp7installINS_10moneypunctIwLb1EEEEEvPT_ C _ZNSt3__16locale5__imp7installINS_12ctype_bynameIcEEEEvPT_ C _ZNSt3__16locale5__imp7installINS_12ctype_bynameIwEEEEvPT_ + C _ZNSt3__16locale5__imp7installINS_14codecvt_bynameIDic10_mbstate_tEEEEvPT_ + C _ZNSt3__16locale5__imp7installINS_14codecvt_bynameIDsc10_mbstate_tEEEEvPT_ C _ZNSt3__16locale5__imp7installINS_14codecvt_bynameIcc10_mbstate_tEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_14codecvt_bynameIjc10_mbstate_tEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_14codecvt_bynameItc10_mbstate_tEEEEvPT_ C _ZNSt3__16locale5__imp7installINS_14codecvt_bynameIwc10_mbstate_tEEEEvPT_ C _ZNSt3__16locale5__imp7installINS_14collate_bynameIcEEEEvPT_ C _ZNSt3__16locale5__imp7installINS_14collate_bynameIwEEEEvPT_ @@ -2107,9 +2061,9 @@ C _ZNSt3__16locale5__imp7installINS_17moneypunct_bynameIwLb1EEEEEvPT_ C _ZNSt3__16locale5__imp7installINS_5ctypeIcEEEEvPT_ C _ZNSt3__16locale5__imp7installINS_5ctypeIwEEEEvPT_ + C _ZNSt3__16locale5__imp7installINS_7codecvtIDic10_mbstate_tEEEEvPT_ + C _ZNSt3__16locale5__imp7installINS_7codecvtIDsc10_mbstate_tEEEEvPT_ C _ZNSt3__16locale5__imp7installINS_7codecvtIcc10_mbstate_tEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_7codecvtIjc10_mbstate_tEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_7codecvtItc10_mbstate_tEEEEvPT_ C _ZNSt3__16locale5__imp7installINS_7codecvtIwc10_mbstate_tEEEEvPT_ C _ZNSt3__16locale5__imp7installINS_7collateIcEEEEvPT_ C _ZNSt3__16locale5__imp7installINS_7collateIwEEEEvPT_ @@ -2144,13 +2098,18 @@ T _ZNSt3__16locale5__impD0Ev T _ZNSt3__16locale5__impD1Ev T _ZNSt3__16locale5__impD2Ev + D _ZNSt3__16locale5ctypeE T _ZNSt3__16locale5facet16__on_zero_sharedEv T _ZNSt3__16locale5facetD0Ev T _ZNSt3__16locale5facetD1Ev T _ZNSt3__16locale5facetD2Ev T _ZNSt3__16locale6globalERKS0_ T _ZNSt3__16locale7classicEv + D _ZNSt3__16locale7collateE + D _ZNSt3__16locale7numericE T _ZNSt3__16locale8__globalEv + D _ZNSt3__16locale8messagesE + D _ZNSt3__16locale8monetaryE T _ZNSt3__16localeC1EPKc T _ZNSt3__16localeC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE T _ZNSt3__16localeC1ERKS0_ @@ -2175,9 +2134,11 @@ T _ZNSt3__16thread6detachEv T _ZNSt3__16threadD1Ev T _ZNSt3__16threadD2Ev + C _ZNSt3__16vectorINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hidden_allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ C _ZNSt3__16vectorINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hidden_allocatorIS6_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS8_EE C _ZNSt3__16vectorINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hidden_allocatorIS6_EEED1Ev C _ZNSt3__16vectorINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hidden_allocatorIS6_EEED2Ev + C _ZNSt3__16vectorIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ C _ZNSt3__16vectorIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS2_RS4_EE C _ZNSt3__16vectorIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEED1Ev C _ZNSt3__16vectorIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEED2Ev @@ -2185,7 +2146,7 @@ C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE18__construct_at_endEj C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE18__construct_at_endIPS3_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESA_SA_ C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE - C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE6assignIPS3_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESA_SA_ + C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE6assignIPS3_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS3_NS_15iterator_traitsISA_E9referenceEEE5valueEvE4typeESA_SA_ C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE6resizeEj C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE8__appendEj C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE8allocateEj @@ -2238,18 +2199,18 @@ C _ZNSt3__17__sort5IRNS_6__lessIwwEEPwEEjT0_S5_S5_S5_S5_T_ C _ZNSt3__17__sort5IRNS_6__lessIxxEEPxEEjT0_S5_S5_S5_S5_T_ C _ZNSt3__17__sort5IRNS_6__lessIyyEEPyEEjT0_S5_S5_S5_S5_T_ + D _ZNSt3__17codecvtIDic10_mbstate_tE2idE + T _ZNSt3__17codecvtIDic10_mbstate_tED0Ev + T _ZNSt3__17codecvtIDic10_mbstate_tED1Ev + T _ZNSt3__17codecvtIDic10_mbstate_tED2Ev + D _ZNSt3__17codecvtIDsc10_mbstate_tE2idE + T _ZNSt3__17codecvtIDsc10_mbstate_tED0Ev + T _ZNSt3__17codecvtIDsc10_mbstate_tED1Ev + T _ZNSt3__17codecvtIDsc10_mbstate_tED2Ev D _ZNSt3__17codecvtIcc10_mbstate_tE2idE T _ZNSt3__17codecvtIcc10_mbstate_tED0Ev - ? _ZNSt3__17codecvtIcc10_mbstate_tED1Ev + T _ZNSt3__17codecvtIcc10_mbstate_tED1Ev T _ZNSt3__17codecvtIcc10_mbstate_tED2Ev - D _ZNSt3__17codecvtIjc10_mbstate_tE2idE - T _ZNSt3__17codecvtIjc10_mbstate_tED0Ev - ? _ZNSt3__17codecvtIjc10_mbstate_tED1Ev - T _ZNSt3__17codecvtIjc10_mbstate_tED2Ev - D _ZNSt3__17codecvtItc10_mbstate_tE2idE - T _ZNSt3__17codecvtItc10_mbstate_tED0Ev - ? _ZNSt3__17codecvtItc10_mbstate_tED1Ev - T _ZNSt3__17codecvtItc10_mbstate_tED2Ev D _ZNSt3__17codecvtIwc10_mbstate_tE2idE T _ZNSt3__17codecvtIwc10_mbstate_tEC1EPKcj T _ZNSt3__17codecvtIwc10_mbstate_tEC1Ej @@ -2314,6 +2275,10 @@ T _ZNSt3__18__rs_getEv C _ZNSt3__18__searchIRNS_11__traits_eqINS_11char_traitsIcEEEEPKcS7_EET0_S8_S8_T1_S9_T_NS_26random_access_iterator_tagESB_ C _ZNSt3__18__searchIRNS_11__traits_eqINS_11char_traitsIwEEEEPKwS7_EET0_S8_S8_T1_S9_T_NS_26random_access_iterator_tagESB_ + T _ZNSt3__18__sp_mut4lockEv + T _ZNSt3__18__sp_mut6unlockEv + C _ZNSt3__18__sp_mutC1EPv + C _ZNSt3__18__sp_mutC2EPv D _ZNSt3__18ios_base10floatfieldE D _ZNSt3__18ios_base10scientificE D _ZNSt3__18ios_base11adjustfieldE @@ -2448,6 +2413,7 @@ W _ZNSt3__19basic_iosIcNS_11char_traitsIcEEE3tieEPNS_13basic_ostreamIcS2_EE W _ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEc W _ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE + W _ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4moveEOS3_ W _ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4moveERS3_ W _ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4swapERS3_ W _ZNSt3__19basic_iosIcNS_11char_traitsIcEEE5clearEj @@ -2467,6 +2433,7 @@ W _ZNSt3__19basic_iosIwNS_11char_traitsIwEEE3tieEPNS_13basic_ostreamIwS2_EE W _ZNSt3__19basic_iosIwNS_11char_traitsIwEEE4fillEw W _ZNSt3__19basic_iosIwNS_11char_traitsIwEEE4initEPNS_15basic_streambufIwS2_EE + W _ZNSt3__19basic_iosIwNS_11char_traitsIwEEE4moveEOS3_ W _ZNSt3__19basic_iosIwNS_11char_traitsIwEEE4moveERS3_ W _ZNSt3__19basic_iosIwNS_11char_traitsIwEEE4swapERS3_ W _ZNSt3__19basic_iosIwNS_11char_traitsIwEEE5clearEj @@ -2520,55 +2487,7 @@ T _ZNSt3__19to_stringEm T _ZNSt3__19to_stringEx T _ZNSt3__19to_stringEy - t _ZNSt3__1L10__init_patERNS_10money_base7patternEccc - t _ZNSt3__1L10init_am_pmEv - t _ZNSt3__1L10init_weeksEv - t _ZNSt3__1L11init_monthsEv - t _ZNSt3__1L11init_wam_pmEv - t _ZNSt3__1L11init_wweeksEv - t _ZNSt3__1L12init_wmonthsEv - t _ZNSt3__1L12ucs2_to_utf8EPKtS1_RS1_PhS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L12ucs4_to_utf8EPKjS1_RS1_PhS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L12utf8_to_ucs2EPKhS1_RS1_PtS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L12utf8_to_ucs4EPKhS1_RS1_PjS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L13utf16_to_utf8EPKjS1_RS1_PhS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L13utf16_to_utf8EPKtS1_RS1_PhS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L13utf8_to_utf16EPKhS1_RS1_PjS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L13utf8_to_utf16EPKhS1_RS1_PtS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L15ucs2_to_utf16beEPKtS1_RS1_PhS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L15ucs2_to_utf16leEPKtS1_RS1_PhS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L15ucs4_to_utf16beEPKjS1_RS1_PhS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L15ucs4_to_utf16leEPKjS1_RS1_PhS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L15utf16be_to_ucs2EPKhS1_RS1_PtS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L15utf16be_to_ucs4EPKhS1_RS1_PjS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L15utf16le_to_ucs2EPKhS1_RS1_PtS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L15utf16le_to_ucs4EPKhS1_RS1_PjS3_RS3_mNS_12codecvt_modeE - t _ZNSt3__1L19utf8_to_ucs2_lengthEPKhS1_jmNS_12codecvt_modeE - t _ZNSt3__1L19utf8_to_ucs4_lengthEPKhS1_jmNS_12codecvt_modeE - t _ZNSt3__1L20utf8_to_utf16_lengthEPKhS1_jmNS_12codecvt_modeE - t _ZNSt3__1L22make_error_type_stringENS_15regex_constants10error_typeE - t _ZNSt3__1L22utf16be_to_ucs2_lengthEPKhS1_jmNS_12codecvt_modeE - t _ZNSt3__1L22utf16be_to_ucs4_lengthEPKhS1_jmNS_12codecvt_modeE - t _ZNSt3__1L22utf16le_to_ucs2_lengthEPKhS1_jmNS_12codecvt_modeE - t _ZNSt3__1L22utf16le_to_ucs4_lengthEPKhS1_jmNS_12codecvt_modeE - d _ZNSt3__1L2cvE - d _ZNSt3__1L3mutE - d _ZNSt3__1L5__cinE - d _ZNSt3__1L6__cerrE - d _ZNSt3__1L6__coutE - d _ZNSt3__1L6__wcinE - d _ZNSt3__1L7__wcerrE - d _ZNSt3__1L7__wcoutE - d _ZNSt3__1L8__rs_mutE W _ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EEPKS6_RKS9_ - T _ZNSt8bad_castC1Ev - T _ZNSt8bad_castC2Ev - T _ZNSt8bad_castD0Ev - T _ZNSt8bad_castD1Ev - T _ZNSt8bad_castD2Ev - T _ZNSt9exceptionD0Ev - T _ZNSt9exceptionD1Ev - T _ZNSt9exceptionD2Ev T _ZSt10unexpectedv T _ZSt13get_terminatev T _ZSt13set_terminatePFvvE @@ -2577,7 +2496,6 @@ T _ZSt17current_exceptionv T _ZSt17rethrow_exceptionSt13exception_ptr C _ZSt18make_exception_ptrINSt3__112future_errorEESt13exception_ptrT_ - D _ZSt7nothrow D _ZTCNSt3__110istrstreamE0_NS_13basic_istreamIcNS_11char_traitsIcEEEE D _ZTCNSt3__110ostrstreamE0_NS_13basic_ostreamIcNS_11char_traitsIcEEEE W _ZTCNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE0_NS_13basic_istreamIcS2_EE @@ -2617,24 +2535,24 @@ W _ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE W _ZTINSt3__113basic_ostreamIwNS_11char_traitsIwEEEE C _ZTINSt3__113messages_baseE - D _ZTINSt3__114__codecvt_utf8IjEE - D _ZTINSt3__114__codecvt_utf8ItEE + D _ZTINSt3__114__codecvt_utf8IDiEE + D _ZTINSt3__114__codecvt_utf8IDsEE D _ZTINSt3__114__codecvt_utf8IwEE C _ZTINSt3__114__num_get_baseE C _ZTINSt3__114__num_put_baseE D _ZTINSt3__114__shared_countE W _ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE + W _ZTINSt3__114codecvt_bynameIDic10_mbstate_tEE + W _ZTINSt3__114codecvt_bynameIDsc10_mbstate_tEE W _ZTINSt3__114codecvt_bynameIcc10_mbstate_tEE - W _ZTINSt3__114codecvt_bynameIjc10_mbstate_tEE - W _ZTINSt3__114codecvt_bynameItc10_mbstate_tEE W _ZTINSt3__114codecvt_bynameIwc10_mbstate_tEE D _ZTINSt3__114collate_bynameIcEE D _ZTINSt3__114collate_bynameIwEE D _ZTINSt3__114error_categoryE - D _ZTINSt3__115__codecvt_utf16IjLb0EEE - D _ZTINSt3__115__codecvt_utf16IjLb1EEE - D _ZTINSt3__115__codecvt_utf16ItLb0EEE - D _ZTINSt3__115__codecvt_utf16ItLb1EEE + D _ZTINSt3__115__codecvt_utf16IDiLb0EEE + D _ZTINSt3__115__codecvt_utf16IDiLb1EEE + D _ZTINSt3__115__codecvt_utf16IDsLb0EEE + D _ZTINSt3__115__codecvt_utf16IDsLb1EEE D _ZTINSt3__115__codecvt_utf16IwLb0EEE D _ZTINSt3__115__codecvt_utf16IwLb1EEE C _ZTINSt3__115__time_get_tempIcEE @@ -2662,8 +2580,8 @@ C _ZTINSt3__118__time_get_storageIwEE D _ZTINSt3__119__iostream_categoryE D _ZTINSt3__119__shared_weak_countE - D _ZTINSt3__120__codecvt_utf8_utf16IjEE - D _ZTINSt3__120__codecvt_utf8_utf16ItEE + D _ZTINSt3__120__codecvt_utf8_utf16IDiEE + D _ZTINSt3__120__codecvt_utf8_utf16IDsEE D _ZTINSt3__120__codecvt_utf8_utf16IwEE C _ZTINSt3__120__time_get_c_storageIcEE C _ZTINSt3__120__time_get_c_storageIwEE @@ -2674,9 +2592,9 @@ D _ZTINSt3__15ctypeIwEE D _ZTINSt3__16locale5__impE D _ZTINSt3__16locale5facetE + D _ZTINSt3__17codecvtIDic10_mbstate_tEE + D _ZTINSt3__17codecvtIDsc10_mbstate_tEE D _ZTINSt3__17codecvtIcc10_mbstate_tEE - D _ZTINSt3__17codecvtIjc10_mbstate_tEE - D _ZTINSt3__17codecvtItc10_mbstate_tEE D _ZTINSt3__17codecvtIwc10_mbstate_tEE W _ZTINSt3__17collateIcEE W _ZTINSt3__17collateIwEE @@ -2707,7 +2625,6 @@ W _ZTINSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE D _ZTINSt3__19strstreamE C _ZTINSt3__19time_baseE - D _ZTISt10bad_typeid D _ZTISt11logic_error D _ZTISt11range_error D _ZTISt12domain_error @@ -2719,8 +2636,6 @@ D _ZTISt15underflow_error D _ZTISt16invalid_argument D _ZTISt16nested_exception - D _ZTISt8bad_cast - D _ZTISt9exception C _ZTSNSt3__110__stdinbufIcEE C _ZTSNSt3__110__stdinbufIwEE C _ZTSNSt3__110__time_getE @@ -2753,24 +2668,24 @@ W _ZTSNSt3__113basic_ostreamIcNS_11char_traitsIcEEEE W _ZTSNSt3__113basic_ostreamIwNS_11char_traitsIwEEEE C _ZTSNSt3__113messages_baseE - D _ZTSNSt3__114__codecvt_utf8IjEE - D _ZTSNSt3__114__codecvt_utf8ItEE + D _ZTSNSt3__114__codecvt_utf8IDiEE + D _ZTSNSt3__114__codecvt_utf8IDsEE D _ZTSNSt3__114__codecvt_utf8IwEE C _ZTSNSt3__114__num_get_baseE C _ZTSNSt3__114__num_put_baseE D _ZTSNSt3__114__shared_countE W _ZTSNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE + W _ZTSNSt3__114codecvt_bynameIDic10_mbstate_tEE + W _ZTSNSt3__114codecvt_bynameIDsc10_mbstate_tEE W _ZTSNSt3__114codecvt_bynameIcc10_mbstate_tEE - W _ZTSNSt3__114codecvt_bynameIjc10_mbstate_tEE - W _ZTSNSt3__114codecvt_bynameItc10_mbstate_tEE W _ZTSNSt3__114codecvt_bynameIwc10_mbstate_tEE D _ZTSNSt3__114collate_bynameIcEE D _ZTSNSt3__114collate_bynameIwEE D _ZTSNSt3__114error_categoryE - D _ZTSNSt3__115__codecvt_utf16IjLb0EEE - D _ZTSNSt3__115__codecvt_utf16IjLb1EEE - D _ZTSNSt3__115__codecvt_utf16ItLb0EEE - D _ZTSNSt3__115__codecvt_utf16ItLb1EEE + D _ZTSNSt3__115__codecvt_utf16IDiLb0EEE + D _ZTSNSt3__115__codecvt_utf16IDiLb1EEE + D _ZTSNSt3__115__codecvt_utf16IDsLb0EEE + D _ZTSNSt3__115__codecvt_utf16IDsLb1EEE D _ZTSNSt3__115__codecvt_utf16IwLb0EEE D _ZTSNSt3__115__codecvt_utf16IwLb1EEE C _ZTSNSt3__115__time_get_tempIcEE @@ -2798,8 +2713,8 @@ C _ZTSNSt3__118__time_get_storageIwEE D _ZTSNSt3__119__iostream_categoryE D _ZTSNSt3__119__shared_weak_countE - D _ZTSNSt3__120__codecvt_utf8_utf16IjEE - D _ZTSNSt3__120__codecvt_utf8_utf16ItEE + D _ZTSNSt3__120__codecvt_utf8_utf16IDiEE + D _ZTSNSt3__120__codecvt_utf8_utf16IDsEE D _ZTSNSt3__120__codecvt_utf8_utf16IwEE C _ZTSNSt3__120__time_get_c_storageIcEE C _ZTSNSt3__120__time_get_c_storageIwEE @@ -2810,9 +2725,9 @@ D _ZTSNSt3__15ctypeIwEE D _ZTSNSt3__16locale5__impE D _ZTSNSt3__16locale5facetE + D _ZTSNSt3__17codecvtIDic10_mbstate_tEE + D _ZTSNSt3__17codecvtIDsc10_mbstate_tEE D _ZTSNSt3__17codecvtIcc10_mbstate_tEE - D _ZTSNSt3__17codecvtIjc10_mbstate_tEE - D _ZTSNSt3__17codecvtItc10_mbstate_tEE D _ZTSNSt3__17codecvtIwc10_mbstate_tEE W _ZTSNSt3__17collateIcEE W _ZTSNSt3__17collateIwEE @@ -2843,7 +2758,6 @@ W _ZTSNSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE D _ZTSNSt3__19strstreamE C _ZTSNSt3__19time_baseE - D _ZTSSt10bad_typeid D _ZTSSt11logic_error D _ZTSSt11range_error D _ZTSSt12domain_error @@ -2855,8 +2769,6 @@ D _ZTSSt15underflow_error D _ZTSSt16invalid_argument D _ZTSSt16nested_exception - D _ZTSSt8bad_cast - D _ZTSSt9exception D _ZTTNSt3__110istrstreamE D _ZTTNSt3__110ostrstreamE W _ZTTNSt3__113basic_istreamIcNS_11char_traitsIcEEEE @@ -2887,22 +2799,22 @@ W _ZTVNSt3__113basic_istreamIwNS_11char_traitsIwEEEE W _ZTVNSt3__113basic_ostreamIcNS_11char_traitsIcEEEE W _ZTVNSt3__113basic_ostreamIwNS_11char_traitsIwEEEE - D _ZTVNSt3__114__codecvt_utf8IjEE - D _ZTVNSt3__114__codecvt_utf8ItEE + D _ZTVNSt3__114__codecvt_utf8IDiEE + D _ZTVNSt3__114__codecvt_utf8IDsEE D _ZTVNSt3__114__codecvt_utf8IwEE D _ZTVNSt3__114__shared_countE W _ZTVNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE + W _ZTVNSt3__114codecvt_bynameIDic10_mbstate_tEE + W _ZTVNSt3__114codecvt_bynameIDsc10_mbstate_tEE W _ZTVNSt3__114codecvt_bynameIcc10_mbstate_tEE - W _ZTVNSt3__114codecvt_bynameIjc10_mbstate_tEE - W _ZTVNSt3__114codecvt_bynameItc10_mbstate_tEE W _ZTVNSt3__114codecvt_bynameIwc10_mbstate_tEE D _ZTVNSt3__114collate_bynameIcEE D _ZTVNSt3__114collate_bynameIwEE D _ZTVNSt3__114error_categoryE - D _ZTVNSt3__115__codecvt_utf16IjLb0EEE - D _ZTVNSt3__115__codecvt_utf16IjLb1EEE - D _ZTVNSt3__115__codecvt_utf16ItLb0EEE - D _ZTVNSt3__115__codecvt_utf16ItLb1EEE + D _ZTVNSt3__115__codecvt_utf16IDiLb0EEE + D _ZTVNSt3__115__codecvt_utf16IDiLb1EEE + D _ZTVNSt3__115__codecvt_utf16IDsLb0EEE + D _ZTVNSt3__115__codecvt_utf16IDsLb1EEE D _ZTVNSt3__115__codecvt_utf16IwLb0EEE D _ZTVNSt3__115__codecvt_utf16IwLb1EEE C _ZTVNSt3__115__time_get_tempIcEE @@ -2928,8 +2840,8 @@ W _ZTVNSt3__117moneypunct_bynameIwLb1EEE D _ZTVNSt3__119__iostream_categoryE D _ZTVNSt3__119__shared_weak_countE - D _ZTVNSt3__120__codecvt_utf8_utf16IjEE - D _ZTVNSt3__120__codecvt_utf8_utf16ItEE + D _ZTVNSt3__120__codecvt_utf8_utf16IDiEE + D _ZTVNSt3__120__codecvt_utf8_utf16IDsEE D _ZTVNSt3__120__codecvt_utf8_utf16IwEE C _ZTVNSt3__120__time_get_c_storageIcEE C _ZTVNSt3__120__time_get_c_storageIwEE @@ -2940,9 +2852,9 @@ D _ZTVNSt3__15ctypeIwEE D _ZTVNSt3__16locale5__impE D _ZTVNSt3__16locale5facetE + D _ZTVNSt3__17codecvtIDic10_mbstate_tEE + D _ZTVNSt3__17codecvtIDsc10_mbstate_tEE D _ZTVNSt3__17codecvtIcc10_mbstate_tEE - D _ZTVNSt3__17codecvtIjc10_mbstate_tEE - D _ZTVNSt3__17codecvtItc10_mbstate_tEE D _ZTVNSt3__17codecvtIwc10_mbstate_tEE W _ZTVNSt3__17collateIcEE W _ZTVNSt3__17collateIwEE @@ -2968,7 +2880,6 @@ W _ZTVNSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE W _ZTVNSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE D _ZTVNSt3__19strstreamE - D _ZTVSt10bad_typeid D _ZTVSt11logic_error D _ZTVSt11range_error D _ZTVSt12domain_error @@ -2980,8 +2891,6 @@ D _ZTVSt15underflow_error D _ZTVSt16invalid_argument D _ZTVSt16nested_exception - D _ZTVSt8bad_cast - D _ZTVSt9exception W _ZThn8_NKSt3__115time_get_bynameIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE3__XEv W _ZThn8_NKSt3__115time_get_bynameIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE3__cEv W _ZThn8_NKSt3__115time_get_bynameIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE3__rEv @@ -3016,82 +2925,3 @@ W _ZTv0_n12_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev T _ZTv0_n12_NSt3__19strstreamD0Ev T _ZTv0_n12_NSt3__19strstreamD1Ev - d _ZZNKSt3__120__time_get_c_storageIcE3__XEvE1s - d _ZZNKSt3__120__time_get_c_storageIcE3__cEvE1s - d _ZZNKSt3__120__time_get_c_storageIcE3__rEvE1s - d _ZZNKSt3__120__time_get_c_storageIcE3__xEvE1s - d _ZZNKSt3__120__time_get_c_storageIcE7__am_pmEvE5am_pm - d _ZZNKSt3__120__time_get_c_storageIcE7__weeksEvE5weeks - d _ZZNKSt3__120__time_get_c_storageIcE8__monthsEvE6months - d _ZZNKSt3__120__time_get_c_storageIwE3__XEvE1s - d _ZZNKSt3__120__time_get_c_storageIwE3__cEvE1s - d _ZZNKSt3__120__time_get_c_storageIwE3__rEvE1s - d _ZZNKSt3__120__time_get_c_storageIwE3__xEvE1s - d _ZZNKSt3__120__time_get_c_storageIwE7__am_pmEvE5am_pm - d _ZZNKSt3__120__time_get_c_storageIwE7__weeksEvE5weeks - d _ZZNKSt3__120__time_get_c_storageIwE8__monthsEvE6months - d _ZZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_timeES4_S4_RNS_8ios_baseERjP2tmE5__fmt - d _ZZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmccE5__fmt - d _ZZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmccE5__fmt11 - d _ZZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmccE5__fmt12 - d _ZZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmccE5__fmt13 - d _ZZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmccE5__fmt14 - d _ZZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11do_get_timeES4_S4_RNS_8ios_baseERjP2tmE5__fmt - d _ZZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmccE5__fmt - d _ZZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmccE5__fmt16 - d _ZZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmccE5__fmt17 - d _ZZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmccE5__fmt18 - d _ZZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmccE5__fmt19 - d _ZZNKSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_bRNS_8ios_baseERjReE5__src - d _ZZNKSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_bRNS_8ios_baseERjReE5__src - d _ZZNSt3__112_GLOBAL__N_13mutEvE1m - d _ZZNSt3__112_GLOBAL__N_14makeINS_10moneypunctIcLb0EEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_10moneypunctIcLb1EEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_10moneypunctIwLb0EEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_10moneypunctIwLb1EEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_5ctypeIcEEPjbiEERT_T0_T1_T2_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_5ctypeIwEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_6locale5__impEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_7codecvtIcc10_mbstate_tEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_7codecvtIjc10_mbstate_tEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_7codecvtItc10_mbstate_tEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_7codecvtIwc10_mbstate_tEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_7collateIcEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_7collateIwEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_7num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_7num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_7num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_7num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_8messagesIcEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_8messagesIwEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_8numpunctIcEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_8numpunctIwEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_8time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_8time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_8time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_9money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_9money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_9money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEEiEERT_T0_E3buf - d _ZZNSt3__112_GLOBAL__N_14makeINS_9money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEEiEERT_T0_E3buf - d _ZZNSt3__112__rs_defaultclEvE6__rs_g - d _ZZNSt3__115future_categoryEvE3__f - d _ZZNSt3__115system_categoryEvE1s - d _ZZNSt3__116generic_categoryEvE1s - d _ZZNSt3__117iostream_categoryEvE1s - d _ZZNSt3__119__thread_local_dataEvE3__p - d _ZZNSt3__16__clocEvE6result - d _ZZNSt3__16locale5__imp11make_globalEvE3buf - d _ZZNSt3__16locale5__imp12make_classicEvE3buf - d _ZZNSt3__16locale7classicEvE1c - d _ZZNSt3__16locale8__globalEvE1g - d _ZZNSt3__18__get_dbEvE2db - d _ZZNSt3__18ios_base15sync_with_stdioEbE14previous_state - d _ZZNSt3__18ios_base5iwordEiE5error - d _ZZNSt3__18ios_base5pwordEiE5error - d _ZZNSt3__1L10init_am_pmEvE5am_pm - d _ZZNSt3__1L10init_weeksEvE5weeks - d _ZZNSt3__1L11init_monthsEvE6months - d _ZZNSt3__1L11init_wam_pmEvE5am_pm - d _ZZNSt3__1L11init_wweeksEvE5weeks - d _ZZNSt3__1L12init_wmonthsEvE6months diff --git a/system/lib/libcxx/thread.cpp b/system/lib/libcxx/thread.cpp index b07f8f85..76af3d0c 100644 --- a/system/lib/libcxx/thread.cpp +++ b/system/lib/libcxx/thread.cpp @@ -11,10 +11,15 @@ #include "exception" #include "vector" #include "future" +#include "limits" #include <sys/types.h> -#if !_WIN32 +#if !defined(_WIN32) +#if !defined(__sun__) && !defined(__linux__) #include <sys/sysctl.h> -#endif // _WIN32 +#else +#include <unistd.h> +#endif // !__sun__ && !__linux__ +#endif // !_WIN32 _LIBCPP_BEGIN_NAMESPACE_STD @@ -52,14 +57,23 @@ thread::detach() } unsigned -thread::hardware_concurrency() +thread::hardware_concurrency() _NOEXCEPT { #if defined(CTL_HW) && defined(HW_NCPU) - int n; + unsigned n; int mib[2] = {CTL_HW, HW_NCPU}; std::size_t s = sizeof(n); sysctl(mib, 2, &n, &s, 0, 0); return n; +#elif (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) && defined(_SC_NPROCESSORS_ONLN)) || defined(EMSCRIPTEN) + long result = sysconf(_SC_NPROCESSORS_ONLN); + // sysconf returns -1 if the name is invalid, the option does not exist or + // does not have a definite limit. + // if sysconf returns some other negative number, we have no idea + // what is going on. Default to something safe. + if (result < 0) + return 0; + return static_cast<unsigned>(result); #else // defined(CTL_HW) && defined(HW_NCPU) // TODO: grovel through /proc or check cpuid on x86 and similar // instructions on other architectures. @@ -74,11 +88,22 @@ void sleep_for(const chrono::nanoseconds& ns) { using namespace chrono; - if (ns >= nanoseconds::zero()) + if (ns > nanoseconds::zero()) { + seconds s = duration_cast<seconds>(ns); timespec ts; - ts.tv_sec = static_cast<decltype(ts.tv_sec)>(duration_cast<seconds>(ns).count()); - ts.tv_nsec = static_cast<decltype(ts.tv_nsec)>((ns - seconds(ts.tv_sec)).count()); + typedef decltype(ts.tv_sec) ts_sec; + _LIBCPP_CONSTEXPR ts_sec ts_sec_max = numeric_limits<ts_sec>::max(); + if (s.count() < ts_sec_max) + { + ts.tv_sec = static_cast<ts_sec>(s.count()); + ts.tv_nsec = static_cast<decltype(ts.tv_nsec)>((ns-s).count()); + } + else + { + ts.tv_sec = ts_sec_max; + ts.tv_nsec = giga::num - 1; + } nanosleep(&ts, 0); } } diff --git a/system/lib/libcxx/typeinfo.cpp b/system/lib/libcxx/typeinfo.cpp index 9ca03a18..7b47d741 100644 --- a/system/lib/libcxx/typeinfo.cpp +++ b/system/lib/libcxx/typeinfo.cpp @@ -7,12 +7,21 @@ // //===----------------------------------------------------------------------===// #include <stdlib.h> -#if __APPLE__ + +#ifndef __has_include +#define __has_include(inc) 0 +#endif + +#ifdef __APPLE__ +#include <cxxabi.h> +#elif defined(LIBCXXRT) || __has_include(<cxxabi.h>) #include <cxxabi.h> #endif #include "typeinfo" +#if !(defined(_LIBCPPABI_VERSION) || defined(LIBCXXRT)) + std::bad_cast::bad_cast() _NOEXCEPT { } @@ -41,10 +50,11 @@ std::bad_typeid::what() const _NOEXCEPT return "std::bad_typeid"; } -#if __APPLE__ +#ifdef __APPLE__ // On Darwin, the cxa_bad_* functions cannot be in the lower level library // because bad_cast and bad_typeid are defined in his higher level library void __cxxabiv1::__cxa_bad_typeid() { throw std::bad_typeid(); } void __cxxabiv1::__cxa_bad_cast() { throw std::bad_cast(); } #endif +#endif // _LIBCPPABI_VERSION diff --git a/system/lib/libcxx/utility.cpp b/system/lib/libcxx/utility.cpp index 7dccffb7..e9830e7c 100644 --- a/system/lib/libcxx/utility.cpp +++ b/system/lib/libcxx/utility.cpp @@ -7,6 +7,7 @@ // //===----------------------------------------------------------------------===// +#define _LIBCPP_BUILDING_UTILITY #include "utility" _LIBCPP_BEGIN_NAMESPACE_STD |