locale revision 227825
1227825Stheraven// -*- C++ -*- 2227825Stheraven//===-------------------------- locale ------------------------------------===// 3227825Stheraven// 4227825Stheraven// The LLVM Compiler Infrastructure 5227825Stheraven// 6227825Stheraven// This file is dual licensed under the MIT and the University of Illinois Open 7227825Stheraven// Source Licenses. See LICENSE.TXT for details. 8227825Stheraven// 9227825Stheraven//===----------------------------------------------------------------------===// 10227825Stheraven 11227825Stheraven#ifndef _LIBCPP_LOCALE 12227825Stheraven#define _LIBCPP_LOCALE 13227825Stheraven 14227825Stheraven/* 15227825Stheraven locale synopsis 16227825Stheraven 17227825Stheravennamespace std 18227825Stheraven{ 19227825Stheraven 20227825Stheravenclass locale 21227825Stheraven{ 22227825Stheravenpublic: 23227825Stheraven // types: 24227825Stheraven class facet; 25227825Stheraven class id; 26227825Stheraven 27227825Stheraven typedef int category; 28227825Stheraven static const category // values assigned here are for exposition only 29227825Stheraven none = 0x000, 30227825Stheraven collate = 0x010, 31227825Stheraven ctype = 0x020, 32227825Stheraven monetary = 0x040, 33227825Stheraven numeric = 0x080, 34227825Stheraven time = 0x100, 35227825Stheraven messages = 0x200, 36227825Stheraven all = collate | ctype | monetary | numeric | time | messages; 37227825Stheraven 38227825Stheraven // construct/copy/destroy: 39227825Stheraven locale() noexcept; 40227825Stheraven locale(const locale& other) noexcept; 41227825Stheraven explicit locale(const char* std_name); 42227825Stheraven explicit locale(const string& std_name); 43227825Stheraven locale(const locale& other, const char* std_name, category); 44227825Stheraven locale(const locale& other, const string& std_name, category); 45227825Stheraven template <class Facet> locale(const locale& other, Facet* f); 46227825Stheraven locale(const locale& other, const locale& one, category); 47227825Stheraven 48227825Stheraven ~locale(); // not virtual 49227825Stheraven 50227825Stheraven const locale& operator=(const locale& other) noexcept; 51227825Stheraven 52227825Stheraven template <class Facet> locale combine(const locale& other) const; 53227825Stheraven 54227825Stheraven // locale operations: 55227825Stheraven basic_string<char> name() const; 56227825Stheraven bool operator==(const locale& other) const; 57227825Stheraven bool operator!=(const locale& other) const; 58227825Stheraven template <class charT, class Traits, class Allocator> 59227825Stheraven bool operator()(const basic_string<charT,Traits,Allocator>& s1, 60227825Stheraven const basic_string<charT,Traits,Allocator>& s2) const; 61227825Stheraven 62227825Stheraven // global locale objects: 63227825Stheraven static locale global(const locale&); 64227825Stheraven static const locale& classic(); 65227825Stheraven}; 66227825Stheraven 67227825Stheraventemplate <class Facet> const Facet& use_facet(const locale&); 68227825Stheraventemplate <class Facet> bool has_facet(const locale&) noexcept; 69227825Stheraven 70227825Stheraven// 22.3.3, convenience interfaces: 71227825Stheraventemplate <class charT> bool isspace (charT c, const locale& loc); 72227825Stheraventemplate <class charT> bool isprint (charT c, const locale& loc); 73227825Stheraventemplate <class charT> bool iscntrl (charT c, const locale& loc); 74227825Stheraventemplate <class charT> bool isupper (charT c, const locale& loc); 75227825Stheraventemplate <class charT> bool islower (charT c, const locale& loc); 76227825Stheraventemplate <class charT> bool isalpha (charT c, const locale& loc); 77227825Stheraventemplate <class charT> bool isdigit (charT c, const locale& loc); 78227825Stheraventemplate <class charT> bool ispunct (charT c, const locale& loc); 79227825Stheraventemplate <class charT> bool isxdigit(charT c, const locale& loc); 80227825Stheraventemplate <class charT> bool isalnum (charT c, const locale& loc); 81227825Stheraventemplate <class charT> bool isgraph (charT c, const locale& loc); 82227825Stheraventemplate <class charT> charT toupper(charT c, const locale& loc); 83227825Stheraventemplate <class charT> charT tolower(charT c, const locale& loc); 84227825Stheraven 85227825Stheraventemplate<class Codecvt, class Elem = wchar_t, 86227825Stheraven class Wide_alloc = allocator<Elem>, 87227825Stheraven class Byte_alloc = allocator<char>> 88227825Stheravenclass wstring_convert 89227825Stheraven{ 90227825Stheravenpublic: 91227825Stheraven typedef basic_string<char, char_traits<char>, Byte_alloc> byte_string; 92227825Stheraven typedef basic_string<Elem, char_traits<Elem>, Wide_alloc> wide_string; 93227825Stheraven typedef typename Codecvt::state_type state_type; 94227825Stheraven typedef typename wide_string::traits_type::int_type int_type; 95227825Stheraven 96227825Stheraven wstring_convert(Codecvt* pcvt = new Codecvt); 97227825Stheraven wstring_convert(Codecvt* pcvt, state_type state); 98227825Stheraven wstring_convert(const byte_string& byte_err, 99227825Stheraven const wide_string& wide_err = wide_string()); 100227825Stheraven ~wstring_convert(); 101227825Stheraven 102227825Stheraven wide_string from_bytes(char byte); 103227825Stheraven wide_string from_bytes(const char* ptr); 104227825Stheraven wide_string from_bytes(const byte_string& str); 105227825Stheraven wide_string from_bytes(const char* first, const char* last); 106227825Stheraven 107227825Stheraven byte_string to_bytes(Elem wchar); 108227825Stheraven byte_string to_bytes(const Elem* wptr); 109227825Stheraven byte_string to_bytes(const wide_string& wstr); 110227825Stheraven byte_string to_bytes(const Elem* first, const Elem* last); 111227825Stheraven 112227825Stheraven size_t converted() const; 113227825Stheraven state_type state() const; 114227825Stheraven}; 115227825Stheraven 116227825Stheraventemplate <class Codecvt, class Elem = wchar_t, class Tr = char_traits<Elem>> 117227825Stheravenclass wbuffer_convert 118227825Stheraven : public basic_streambuf<Elem, Tr> 119227825Stheraven{ 120227825Stheravenpublic: 121227825Stheraven typedef typename Tr::state_type state_type; 122227825Stheraven 123227825Stheraven wbuffer_convert(streambuf* bytebuf = 0, Codecvt* pcvt = new Codecvt, 124227825Stheraven state_type state = state_type()); 125227825Stheraven 126227825Stheraven streambuf* rdbuf() const; 127227825Stheraven streambuf* rdbuf(streambuf* bytebuf); 128227825Stheraven 129227825Stheraven state_type state() const; 130227825Stheraven}; 131227825Stheraven 132227825Stheraven// 22.4.1 and 22.4.1.3, ctype: 133227825Stheravenclass ctype_base; 134227825Stheraventemplate <class charT> class ctype; 135227825Stheraventemplate <> class ctype<char>; // specialization 136227825Stheraventemplate <class charT> class ctype_byname; 137227825Stheraventemplate <> class ctype_byname<char>; // specialization 138227825Stheraven 139227825Stheravenclass codecvt_base; 140227825Stheraventemplate <class internT, class externT, class stateT> class codecvt; 141227825Stheraventemplate <class internT, class externT, class stateT> class codecvt_byname; 142227825Stheraven 143227825Stheraven// 22.4.2 and 22.4.3, numeric: 144227825Stheraventemplate <class charT, class InputIterator> class num_get; 145227825Stheraventemplate <class charT, class OutputIterator> class num_put; 146227825Stheraventemplate <class charT> class numpunct; 147227825Stheraventemplate <class charT> class numpunct_byname; 148227825Stheraven 149227825Stheraven// 22.4.4, col lation: 150227825Stheraventemplate <class charT> class collate; 151227825Stheraventemplate <class charT> class collate_byname; 152227825Stheraven 153227825Stheraven// 22.4.5, date and time: 154227825Stheravenclass time_base; 155227825Stheraventemplate <class charT, class InputIterator> class time_get; 156227825Stheraventemplate <class charT, class InputIterator> class time_get_byname; 157227825Stheraventemplate <class charT, class OutputIterator> class time_put; 158227825Stheraventemplate <class charT, class OutputIterator> class time_put_byname; 159227825Stheraven 160227825Stheraven// 22.4.6, money: 161227825Stheravenclass money_base; 162227825Stheraventemplate <class charT, class InputIterator> class money_get; 163227825Stheraventemplate <class charT, class OutputIterator> class money_put; 164227825Stheraventemplate <class charT, bool Intl> class moneypunct; 165227825Stheraventemplate <class charT, bool Intl> class moneypunct_byname; 166227825Stheraven 167227825Stheraven// 22.4.7, message retrieval: 168227825Stheravenclass messages_base; 169227825Stheraventemplate <class charT> class messages; 170227825Stheraventemplate <class charT> class messages_byname; 171227825Stheraven 172227825Stheraven} // std 173227825Stheraven 174227825Stheraven*/ 175227825Stheraven 176227825Stheraven#include <__config> 177227825Stheraven#include <__locale> 178227825Stheraven#include <algorithm> 179227825Stheraven#include <memory> 180227825Stheraven#include <ios> 181227825Stheraven#include <streambuf> 182227825Stheraven#include <iterator> 183227825Stheraven#include <limits> 184227825Stheraven#if !__APPLE__ 185227825Stheraven#include <cstdarg> 186227825Stheraven#endif 187227825Stheraven#include <cstdlib> 188227825Stheraven#include <ctime> 189227825Stheraven#if _WIN32 190227825Stheraven#include <support/win32/locale_win32.h> 191227825Stheraven#else // _WIN32 192227825Stheraven#include <nl_types.h> 193227825Stheraven#endif // !_WIN32 194227825Stheraven 195227825Stheraven#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 196227825Stheraven#pragma GCC system_header 197227825Stheraven#endif 198227825Stheraven 199227825Stheraven_LIBCPP_BEGIN_NAMESPACE_STD 200227825Stheraven 201227825Stheraven#if __APPLE__ || __FreeBSD__ 202227825Stheraven# define _LIBCPP_GET_C_LOCALE 0 203227825Stheraven#else 204227825Stheraven# define _LIBCPP_GET_C_LOCALE __cloc() 205227825Stheraven // Get the C locale object 206227825Stheraven locale_t __cloc(); 207227825Stheraven#define __cloc_defined 208227825Stheraven#endif 209227825Stheraven 210227825Stheraventypedef _VSTD::remove_pointer<locale_t>::type __locale_struct; 211227825Stheraventypedef _VSTD::unique_ptr<__locale_struct, decltype(&freelocale)> __locale_unique_ptr; 212227825Stheraventypedef _VSTD::unique_ptr<__locale_struct, decltype(&uselocale)> __locale_raii; 213227825Stheraven 214227825Stheraven// OSX has nice foo_l() functions that let you turn off use of the global 215227825Stheraven// locale. Linux, not so much. The following functions avoid the locale when 216227825Stheraven// that's possible and otherwise do the wrong thing. FIXME. 217227825Stheraven#ifdef __linux__ 218227825Stheraven 219227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 220227825Stheravendecltype(MB_CUR_MAX_L(_VSTD::declval<locale_t>())) 221227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 222227825Stheraven__mb_cur_max_l(locale_t __l) 223227825Stheraven{ 224227825Stheraven return MB_CUR_MAX_L(__l); 225227825Stheraven} 226227825Stheraven#else // _LIBCPP_LOCALE__L_EXTENSIONS 227227825Stheraven_LIBCPP_ALWAYS_INLINE inline 228227825Stheravendecltype(MB_CUR_MAX) __mb_cur_max_l(locale_t __l) 229227825Stheraven{ 230227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 231227825Stheraven return MB_CUR_MAX; 232227825Stheraven} 233227825Stheraven#endif // _LIBCPP_LOCALE__L_EXTENSIONS 234227825Stheraven 235227825Stheraven_LIBCPP_ALWAYS_INLINE inline 236227825Stheravenwint_t __btowc_l(int __c, locale_t __l) 237227825Stheraven{ 238227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 239227825Stheraven return btowc_l(__c, __l); 240227825Stheraven#else 241227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 242227825Stheraven return btowc(__c); 243227825Stheraven#endif 244227825Stheraven} 245227825Stheraven 246227825Stheraven_LIBCPP_ALWAYS_INLINE inline 247227825Stheravenint __wctob_l(wint_t __c, locale_t __l) 248227825Stheraven{ 249227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 250227825Stheraven return wctob_l(__c, __l); 251227825Stheraven#else 252227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 253227825Stheraven return wctob(__c); 254227825Stheraven#endif 255227825Stheraven} 256227825Stheraven 257227825Stheraven_LIBCPP_ALWAYS_INLINE inline 258227825Stheravensize_t __wcsnrtombs_l(char *__dest, const wchar_t **__src, size_t __nwc, 259227825Stheraven size_t __len, mbstate_t *__ps, locale_t __l) 260227825Stheraven{ 261227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 262227825Stheraven return wcsnrtombs_l(__dest, __src, __nwc, __len, __ps, __l); 263227825Stheraven#else 264227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 265227825Stheraven return wcsnrtombs(__dest, __src, __nwc, __len, __ps); 266227825Stheraven#endif 267227825Stheraven} 268227825Stheraven 269227825Stheraven_LIBCPP_ALWAYS_INLINE inline 270227825Stheravensize_t __wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l) 271227825Stheraven{ 272227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 273227825Stheraven return wcrtomb_l(__s, __wc, __ps, __l); 274227825Stheraven#else 275227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 276227825Stheraven return wcrtomb(__s, __wc, __ps); 277227825Stheraven#endif 278227825Stheraven} 279227825Stheraven 280227825Stheraven_LIBCPP_ALWAYS_INLINE inline 281227825Stheravensize_t __mbsnrtowcs_l(wchar_t * __dest, const char **__src, size_t __nms, 282227825Stheraven size_t __len, mbstate_t *__ps, locale_t __l) 283227825Stheraven{ 284227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 285227825Stheraven return mbsnrtowcs_l(__dest, __src, __nms, __len, __ps, __l); 286227825Stheraven#else 287227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 288227825Stheraven return mbsnrtowcs(__dest, __src, __nms, __len, __ps); 289227825Stheraven#endif 290227825Stheraven} 291227825Stheraven 292227825Stheraven_LIBCPP_ALWAYS_INLINE inline 293227825Stheravensize_t __mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n, 294227825Stheraven mbstate_t *__ps, locale_t __l) 295227825Stheraven{ 296227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 297227825Stheraven return mbrtowc_l(__pwc, __s, __n, __ps, __l); 298227825Stheraven#else 299227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 300227825Stheraven return mbrtowc(__pwc, __s, __n, __ps); 301227825Stheraven#endif 302227825Stheraven} 303227825Stheraven 304227825Stheraven_LIBCPP_ALWAYS_INLINE inline 305227825Stheravenint __mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l) 306227825Stheraven{ 307227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 308227825Stheraven return mbtowc_l(__pwc, __pmb, __max, __l); 309227825Stheraven#else 310227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 311227825Stheraven return mbtowc(__pwc, __pmb, __max); 312227825Stheraven#endif 313227825Stheraven} 314227825Stheraven 315227825Stheraven_LIBCPP_ALWAYS_INLINE inline 316227825Stheravensize_t __mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l) 317227825Stheraven{ 318227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 319227825Stheraven return mbrlen_l(__s, __n, __ps, __l); 320227825Stheraven#else 321227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 322227825Stheraven return mbrlen(__s, __n, __ps); 323227825Stheraven#endif 324227825Stheraven} 325227825Stheraven 326227825Stheraven_LIBCPP_ALWAYS_INLINE inline 327227825Stheravenlconv *__localeconv_l(locale_t __l) 328227825Stheraven{ 329227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 330227825Stheraven return localeconv_l(__l); 331227825Stheraven#else 332227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 333227825Stheraven return localeconv(); 334227825Stheraven#endif 335227825Stheraven} 336227825Stheraven 337227825Stheraven_LIBCPP_ALWAYS_INLINE inline 338227825Stheravensize_t __mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len, 339227825Stheraven mbstate_t *__ps, locale_t __l) 340227825Stheraven{ 341227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 342227825Stheraven return mbsrtowcs_l(__dest, __src, __len, __ps, __l); 343227825Stheraven#else 344227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 345227825Stheraven return mbsrtowcs(__dest, __src, __len, __ps); 346227825Stheraven#endif 347227825Stheraven} 348227825Stheraven 349227825Stheraven_LIBCPP_ALWAYS_INLINE inline 350227825Stheravenint __sprintf_l(char *__s, locale_t __l, const char *__format, ...) { 351227825Stheraven va_list __va; 352227825Stheraven va_start(__va, __format); 353227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 354227825Stheraven int __res = vsprintf_l(__s, __l, __format, __va); 355227825Stheraven#else 356227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 357227825Stheraven int __res = vsprintf(__s, __format, __va); 358227825Stheraven#endif 359227825Stheraven va_end(__va); 360227825Stheraven return __res; 361227825Stheraven} 362227825Stheraven 363227825Stheraven_LIBCPP_ALWAYS_INLINE inline 364227825Stheravenint __snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) { 365227825Stheraven va_list __va; 366227825Stheraven va_start(__va, __format); 367227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 368227825Stheraven int __res = vsnprintf_l(__s, __n, __l, __format, __va); 369227825Stheraven#else 370227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 371227825Stheraven int __res = vsnprintf(__s, __n, __format, __va); 372227825Stheraven#endif 373227825Stheraven va_end(__va); 374227825Stheraven return __res; 375227825Stheraven} 376227825Stheraven 377227825Stheraven_LIBCPP_ALWAYS_INLINE inline 378227825Stheravenint __asprintf_l(char **__s, locale_t __l, const char *__format, ...) { 379227825Stheraven va_list __va; 380227825Stheraven va_start(__va, __format); 381227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 382227825Stheraven int __res = vasprintf_l(__s, __l, __format, __va); 383227825Stheraven#else 384227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 385227825Stheraven int __res = vasprintf(__s, __format, __va); 386227825Stheraven#endif 387227825Stheraven va_end(__va); 388227825Stheraven return __res; 389227825Stheraven} 390227825Stheraven 391227825Stheraven_LIBCPP_ALWAYS_INLINE inline 392227825Stheravenint __sscanf_l(const char *__s, locale_t __l, const char *__format, ...) { 393227825Stheraven va_list __va; 394227825Stheraven va_start(__va, __format); 395227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 396227825Stheraven int __res = vsscanf_l(__s, __l, __format, __va); 397227825Stheraven#else 398227825Stheraven __locale_raii __current(uselocale(__l), uselocale); 399227825Stheraven int __res = vsscanf(__s, __format, __va); 400227825Stheraven#endif 401227825Stheraven va_end(__va); 402227825Stheraven return __res; 403227825Stheraven} 404227825Stheraven 405227825Stheraven#endif // __linux__ 406227825Stheraven 407227825Stheraven// __scan_keyword 408227825Stheraven// Scans [__b, __e) until a match is found in the basic_strings range 409227825Stheraven// [__kb, __ke) or until it can be shown that there is no match in [__kb, __ke). 410227825Stheraven// __b will be incremented (visibly), consuming CharT until a match is found 411227825Stheraven// or proved to not exist. A keyword may be "", in which will match anything. 412227825Stheraven// If one keyword is a prefix of another, and the next CharT in the input 413227825Stheraven// might match another keyword, the algorithm will attempt to find the longest 414227825Stheraven// matching keyword. If the longer matching keyword ends up not matching, then 415227825Stheraven// no keyword match is found. If no keyword match is found, __ke is returned 416227825Stheraven// and failbit is set in __err. 417227825Stheraven// Else an iterator pointing to the matching keyword is found. If more than 418227825Stheraven// one keyword matches, an iterator to the first matching keyword is returned. 419227825Stheraven// If on exit __b == __e, eofbit is set in __err. If __case_senstive is false, 420227825Stheraven// __ct is used to force to lower case before comparing characters. 421227825Stheraven// Examples: 422227825Stheraven// Keywords: "a", "abb" 423227825Stheraven// If the input is "a", the first keyword matches and eofbit is set. 424227825Stheraven// If the input is "abc", no match is found and "ab" are consumed. 425227825Stheraventemplate <class _InputIterator, class _ForwardIterator, class _Ctype> 426227825Stheraven_LIBCPP_HIDDEN 427227825Stheraven_ForwardIterator 428227825Stheraven__scan_keyword(_InputIterator& __b, _InputIterator __e, 429227825Stheraven _ForwardIterator __kb, _ForwardIterator __ke, 430227825Stheraven const _Ctype& __ct, ios_base::iostate& __err, 431227825Stheraven bool __case_sensitive = true) 432227825Stheraven{ 433227825Stheraven typedef typename iterator_traits<_InputIterator>::value_type _CharT; 434227825Stheraven size_t __nkw = _VSTD::distance(__kb, __ke); 435227825Stheraven const unsigned char __doesnt_match = '\0'; 436227825Stheraven const unsigned char __might_match = '\1'; 437227825Stheraven const unsigned char __does_match = '\2'; 438227825Stheraven unsigned char __statbuf[100]; 439227825Stheraven unsigned char* __status = __statbuf; 440227825Stheraven unique_ptr<unsigned char, void(*)(void*)> __stat_hold(0, free); 441227825Stheraven if (__nkw > sizeof(__statbuf)) 442227825Stheraven { 443227825Stheraven __status = (unsigned char*)malloc(__nkw); 444227825Stheraven if (__status == 0) 445227825Stheraven __throw_bad_alloc(); 446227825Stheraven __stat_hold.reset(__status); 447227825Stheraven } 448227825Stheraven size_t __n_might_match = __nkw; // At this point, any keyword might match 449227825Stheraven size_t __n_does_match = 0; // but none of them definitely do 450227825Stheraven // Initialize all statuses to __might_match, except for "" keywords are __does_match 451227825Stheraven unsigned char* __st = __status; 452227825Stheraven for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st) 453227825Stheraven { 454227825Stheraven if (!__ky->empty()) 455227825Stheraven *__st = __might_match; 456227825Stheraven else 457227825Stheraven { 458227825Stheraven *__st = __does_match; 459227825Stheraven --__n_might_match; 460227825Stheraven ++__n_does_match; 461227825Stheraven } 462227825Stheraven } 463227825Stheraven // While there might be a match, test keywords against the next CharT 464227825Stheraven for (size_t __indx = 0; __b != __e && __n_might_match > 0; ++__indx) 465227825Stheraven { 466227825Stheraven // Peek at the next CharT but don't consume it 467227825Stheraven _CharT __c = *__b; 468227825Stheraven if (!__case_sensitive) 469227825Stheraven __c = __ct.toupper(__c); 470227825Stheraven bool __consume = false; 471227825Stheraven // For each keyword which might match, see if the __indx character is __c 472227825Stheraven // If a match if found, consume __c 473227825Stheraven // If a match is found, and that is the last character in the keyword, 474227825Stheraven // then that keyword matches. 475227825Stheraven // If the keyword doesn't match this character, then change the keyword 476227825Stheraven // to doesn't match 477227825Stheraven __st = __status; 478227825Stheraven for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st) 479227825Stheraven { 480227825Stheraven if (*__st == __might_match) 481227825Stheraven { 482227825Stheraven _CharT __kc = (*__ky)[__indx]; 483227825Stheraven if (!__case_sensitive) 484227825Stheraven __kc = __ct.toupper(__kc); 485227825Stheraven if (__c == __kc) 486227825Stheraven { 487227825Stheraven __consume = true; 488227825Stheraven if (__ky->size() == __indx+1) 489227825Stheraven { 490227825Stheraven *__st = __does_match; 491227825Stheraven --__n_might_match; 492227825Stheraven ++__n_does_match; 493227825Stheraven } 494227825Stheraven } 495227825Stheraven else 496227825Stheraven { 497227825Stheraven *__st = __doesnt_match; 498227825Stheraven --__n_might_match; 499227825Stheraven } 500227825Stheraven } 501227825Stheraven } 502227825Stheraven // consume if we matched a character 503227825Stheraven if (__consume) 504227825Stheraven { 505227825Stheraven ++__b; 506227825Stheraven // If we consumed a character and there might be a matched keyword that 507227825Stheraven // was marked matched on a previous iteration, then such keywords 508227825Stheraven // which are now marked as not matching. 509227825Stheraven if (__n_might_match + __n_does_match > 1) 510227825Stheraven { 511227825Stheraven __st = __status; 512227825Stheraven for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st) 513227825Stheraven { 514227825Stheraven if (*__st == __does_match && __ky->size() != __indx+1) 515227825Stheraven { 516227825Stheraven *__st = __doesnt_match; 517227825Stheraven --__n_does_match; 518227825Stheraven } 519227825Stheraven } 520227825Stheraven } 521227825Stheraven } 522227825Stheraven } 523227825Stheraven // We've exited the loop because we hit eof and/or we have no more "might matches". 524227825Stheraven if (__b == __e) 525227825Stheraven __err |= ios_base::eofbit; 526227825Stheraven // Return the first matching result 527227825Stheraven for (__st = __status; __kb != __ke; ++__kb, ++__st) 528227825Stheraven if (*__st == __does_match) 529227825Stheraven break; 530227825Stheraven if (__kb == __ke) 531227825Stheraven __err |= ios_base::failbit; 532227825Stheraven return __kb; 533227825Stheraven} 534227825Stheraven 535227825Stheravenstruct __num_get_base 536227825Stheraven{ 537227825Stheraven static const int __num_get_buf_sz = 40; 538227825Stheraven 539227825Stheraven static int __get_base(ios_base&); 540227825Stheraven static const char __src[33]; 541227825Stheraven}; 542227825Stheraven 543227825Stheravenvoid __check_grouping(const string& __grouping, unsigned* __g, unsigned* __g_end, 544227825Stheraven ios_base::iostate& __err); 545227825Stheraven 546227825Stheraventemplate <class _CharT> 547227825Stheravenstruct __num_get 548227825Stheraven : protected __num_get_base 549227825Stheraven{ 550227825Stheraven static string __stage2_int_prep(ios_base& __iob, _CharT* __atoms, _CharT& __thousands_sep); 551227825Stheraven static string __stage2_float_prep(ios_base& __iob, _CharT* __atoms, _CharT& __decimal_point, 552227825Stheraven _CharT& __thousands_sep); 553227825Stheraven static int __stage2_int_loop(_CharT __ct, int __base, char* __a, char*& __a_end, 554227825Stheraven unsigned& __dc, _CharT __thousands_sep, const string& __grouping, 555227825Stheraven unsigned* __g, unsigned*& __g_end, _CharT* __atoms); 556227825Stheraven static int __stage2_float_loop(_CharT __ct, bool& __in_units, char& __exp, 557227825Stheraven char* __a, char*& __a_end, 558227825Stheraven _CharT __decimal_point, _CharT __thousands_sep, 559227825Stheraven const string& __grouping, unsigned* __g, 560227825Stheraven unsigned*& __g_end, unsigned& __dc, _CharT* __atoms); 561227825Stheraven}; 562227825Stheraven 563227825Stheraventemplate <class _CharT> 564227825Stheravenstring 565227825Stheraven__num_get<_CharT>::__stage2_int_prep(ios_base& __iob, _CharT* __atoms, _CharT& __thousands_sep) 566227825Stheraven{ 567227825Stheraven locale __loc = __iob.getloc(); 568227825Stheraven use_facet<ctype<_CharT> >(__loc).widen(__src, __src + 26, __atoms); 569227825Stheraven const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc); 570227825Stheraven __thousands_sep = __np.thousands_sep(); 571227825Stheraven return __np.grouping(); 572227825Stheraven} 573227825Stheraven 574227825Stheraventemplate <class _CharT> 575227825Stheravenstring 576227825Stheraven__num_get<_CharT>::__stage2_float_prep(ios_base& __iob, _CharT* __atoms, _CharT& __decimal_point, 577227825Stheraven _CharT& __thousands_sep) 578227825Stheraven{ 579227825Stheraven locale __loc = __iob.getloc(); 580227825Stheraven use_facet<ctype<_CharT> >(__loc).widen(__src, __src + 32, __atoms); 581227825Stheraven const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc); 582227825Stheraven __decimal_point = __np.decimal_point(); 583227825Stheraven __thousands_sep = __np.thousands_sep(); 584227825Stheraven return __np.grouping(); 585227825Stheraven} 586227825Stheraven 587227825Stheraventemplate <class _CharT> 588227825Stheravenint 589227825Stheraven__num_get<_CharT>::__stage2_int_loop(_CharT __ct, int __base, char* __a, char*& __a_end, 590227825Stheraven unsigned& __dc, _CharT __thousands_sep, const string& __grouping, 591227825Stheraven unsigned* __g, unsigned*& __g_end, _CharT* __atoms) 592227825Stheraven{ 593227825Stheraven if (__a_end == __a && (__ct == __atoms[24] || __ct == __atoms[25])) 594227825Stheraven { 595227825Stheraven *__a_end++ = __ct == __atoms[24] ? '+' : '-'; 596227825Stheraven __dc = 0; 597227825Stheraven return 0; 598227825Stheraven } 599227825Stheraven if (__ct == __thousands_sep && __grouping.size() != 0) 600227825Stheraven { 601227825Stheraven if (__g_end-__g < __num_get_buf_sz) 602227825Stheraven { 603227825Stheraven *__g_end++ = __dc; 604227825Stheraven __dc = 0; 605227825Stheraven } 606227825Stheraven return 0; 607227825Stheraven } 608227825Stheraven ptrdiff_t __f = find(__atoms, __atoms + 26, __ct) - __atoms; 609227825Stheraven if (__f >= 24) 610227825Stheraven return -1; 611227825Stheraven switch (__base) 612227825Stheraven { 613227825Stheraven case 8: 614227825Stheraven case 10: 615227825Stheraven if (__f >= __base) 616227825Stheraven return -1; 617227825Stheraven break; 618227825Stheraven case 16: 619227825Stheraven if (__f < 22) 620227825Stheraven break; 621227825Stheraven if (__a_end != __a && __a_end - __a <= 2 && __a_end[-1] == '0') 622227825Stheraven { 623227825Stheraven __dc = 0; 624227825Stheraven *__a_end++ = __src[__f]; 625227825Stheraven return 0; 626227825Stheraven } 627227825Stheraven return -1; 628227825Stheraven } 629227825Stheraven if (__a_end-__a < __num_get_buf_sz - 1) 630227825Stheraven *__a_end++ = __src[__f]; 631227825Stheraven ++__dc; 632227825Stheraven return 0; 633227825Stheraven} 634227825Stheraven 635227825Stheraventemplate <class _CharT> 636227825Stheravenint 637227825Stheraven__num_get<_CharT>::__stage2_float_loop(_CharT __ct, bool& __in_units, char& __exp, char* __a, char*& __a_end, 638227825Stheraven _CharT __decimal_point, _CharT __thousands_sep, const string& __grouping, 639227825Stheraven unsigned* __g, unsigned*& __g_end, unsigned& __dc, _CharT* __atoms) 640227825Stheraven{ 641227825Stheraven if (__ct == __decimal_point) 642227825Stheraven { 643227825Stheraven if (!__in_units) 644227825Stheraven return -1; 645227825Stheraven __in_units = false; 646227825Stheraven *__a_end++ = '.'; 647227825Stheraven if (__grouping.size() != 0 && __g_end-__g < __num_get_buf_sz) 648227825Stheraven *__g_end++ = __dc; 649227825Stheraven return 0; 650227825Stheraven } 651227825Stheraven if (__ct == __thousands_sep && __grouping.size() != 0) 652227825Stheraven { 653227825Stheraven if (!__in_units) 654227825Stheraven return -1; 655227825Stheraven if (__g_end-__g < __num_get_buf_sz) 656227825Stheraven { 657227825Stheraven *__g_end++ = __dc; 658227825Stheraven __dc = 0; 659227825Stheraven } 660227825Stheraven return 0; 661227825Stheraven } 662227825Stheraven ptrdiff_t __f = find(__atoms, __atoms + 32, __ct) - __atoms; 663227825Stheraven if (__f >= 32) 664227825Stheraven return -1; 665227825Stheraven char __x = __src[__f]; 666227825Stheraven if (__a_end-__a < __num_get_buf_sz - 1) 667227825Stheraven *__a_end++ = __x; 668227825Stheraven if (__x == 'x' || __x == 'X') 669227825Stheraven __exp = 'P'; 670227825Stheraven else if ((__x & 0xDF) == __exp) 671227825Stheraven { 672227825Stheraven __in_units = false; 673227825Stheraven if (__grouping.size() != 0 && __g_end-__g < __num_get_buf_sz) 674227825Stheraven *__g_end++ = __dc; 675227825Stheraven } 676227825Stheraven if (__f >= 22) 677227825Stheraven return 0; 678227825Stheraven ++__dc; 679227825Stheraven return 0; 680227825Stheraven} 681227825Stheraven 682227825Stheravenextern template class __num_get<char>; 683227825Stheravenextern template class __num_get<wchar_t>; 684227825Stheraven 685227825Stheraventemplate <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> > 686227825Stheravenclass _LIBCPP_VISIBLE num_get 687227825Stheraven : public locale::facet, 688227825Stheraven private __num_get<_CharT> 689227825Stheraven{ 690227825Stheravenpublic: 691227825Stheraven typedef _CharT char_type; 692227825Stheraven typedef _InputIterator iter_type; 693227825Stheraven 694227825Stheraven _LIBCPP_ALWAYS_INLINE 695227825Stheraven explicit num_get(size_t __refs = 0) 696227825Stheraven : locale::facet(__refs) {} 697227825Stheraven 698227825Stheraven _LIBCPP_ALWAYS_INLINE 699227825Stheraven iter_type get(iter_type __b, iter_type __e, ios_base& __iob, 700227825Stheraven ios_base::iostate& __err, bool& __v) const 701227825Stheraven { 702227825Stheraven return do_get(__b, __e, __iob, __err, __v); 703227825Stheraven } 704227825Stheraven 705227825Stheraven _LIBCPP_ALWAYS_INLINE 706227825Stheraven iter_type get(iter_type __b, iter_type __e, ios_base& __iob, 707227825Stheraven ios_base::iostate& __err, long& __v) const 708227825Stheraven { 709227825Stheraven return do_get(__b, __e, __iob, __err, __v); 710227825Stheraven } 711227825Stheraven 712227825Stheraven _LIBCPP_ALWAYS_INLINE 713227825Stheraven iter_type get(iter_type __b, iter_type __e, ios_base& __iob, 714227825Stheraven ios_base::iostate& __err, long long& __v) const 715227825Stheraven { 716227825Stheraven return do_get(__b, __e, __iob, __err, __v); 717227825Stheraven } 718227825Stheraven 719227825Stheraven _LIBCPP_ALWAYS_INLINE 720227825Stheraven iter_type get(iter_type __b, iter_type __e, ios_base& __iob, 721227825Stheraven ios_base::iostate& __err, unsigned short& __v) const 722227825Stheraven { 723227825Stheraven return do_get(__b, __e, __iob, __err, __v); 724227825Stheraven } 725227825Stheraven 726227825Stheraven _LIBCPP_ALWAYS_INLINE 727227825Stheraven iter_type get(iter_type __b, iter_type __e, ios_base& __iob, 728227825Stheraven ios_base::iostate& __err, unsigned int& __v) const 729227825Stheraven { 730227825Stheraven return do_get(__b, __e, __iob, __err, __v); 731227825Stheraven } 732227825Stheraven 733227825Stheraven _LIBCPP_ALWAYS_INLINE 734227825Stheraven iter_type get(iter_type __b, iter_type __e, ios_base& __iob, 735227825Stheraven ios_base::iostate& __err, unsigned long& __v) const 736227825Stheraven { 737227825Stheraven return do_get(__b, __e, __iob, __err, __v); 738227825Stheraven } 739227825Stheraven 740227825Stheraven _LIBCPP_ALWAYS_INLINE 741227825Stheraven iter_type get(iter_type __b, iter_type __e, ios_base& __iob, 742227825Stheraven ios_base::iostate& __err, unsigned long long& __v) const 743227825Stheraven { 744227825Stheraven return do_get(__b, __e, __iob, __err, __v); 745227825Stheraven } 746227825Stheraven 747227825Stheraven _LIBCPP_ALWAYS_INLINE 748227825Stheraven iter_type get(iter_type __b, iter_type __e, ios_base& __iob, 749227825Stheraven ios_base::iostate& __err, float& __v) const 750227825Stheraven { 751227825Stheraven return do_get(__b, __e, __iob, __err, __v); 752227825Stheraven } 753227825Stheraven 754227825Stheraven _LIBCPP_ALWAYS_INLINE 755227825Stheraven iter_type get(iter_type __b, iter_type __e, ios_base& __iob, 756227825Stheraven ios_base::iostate& __err, double& __v) const 757227825Stheraven { 758227825Stheraven return do_get(__b, __e, __iob, __err, __v); 759227825Stheraven } 760227825Stheraven 761227825Stheraven _LIBCPP_ALWAYS_INLINE 762227825Stheraven iter_type get(iter_type __b, iter_type __e, ios_base& __iob, 763227825Stheraven ios_base::iostate& __err, long double& __v) const 764227825Stheraven { 765227825Stheraven return do_get(__b, __e, __iob, __err, __v); 766227825Stheraven } 767227825Stheraven 768227825Stheraven _LIBCPP_ALWAYS_INLINE 769227825Stheraven iter_type get(iter_type __b, iter_type __e, ios_base& __iob, 770227825Stheraven ios_base::iostate& __err, void*& __v) const 771227825Stheraven { 772227825Stheraven return do_get(__b, __e, __iob, __err, __v); 773227825Stheraven } 774227825Stheraven 775227825Stheraven static locale::id id; 776227825Stheraven 777227825Stheravenprotected: 778227825Stheraven _LIBCPP_ALWAYS_INLINE 779227825Stheraven ~num_get() {} 780227825Stheraven 781227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, 782227825Stheraven ios_base::iostate& __err, bool& __v) const; 783227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, 784227825Stheraven ios_base::iostate& __err, long& __v) const; 785227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, 786227825Stheraven ios_base::iostate& __err, long long& __v) const; 787227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, 788227825Stheraven ios_base::iostate& __err, unsigned short& __v) const; 789227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, 790227825Stheraven ios_base::iostate& __err, unsigned int& __v) const; 791227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, 792227825Stheraven ios_base::iostate& __err, unsigned long& __v) const; 793227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, 794227825Stheraven ios_base::iostate& __err, unsigned long long& __v) const; 795227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, 796227825Stheraven ios_base::iostate& __err, float& __v) const; 797227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, 798227825Stheraven ios_base::iostate& __err, double& __v) const; 799227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, 800227825Stheraven ios_base::iostate& __err, long double& __v) const; 801227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, 802227825Stheraven ios_base::iostate& __err, void*& __v) const; 803227825Stheraven}; 804227825Stheraven 805227825Stheraventemplate <class _CharT, class _InputIterator> 806227825Stheravenlocale::id 807227825Stheravennum_get<_CharT, _InputIterator>::id; 808227825Stheraven 809227825Stheraventemplate <class _Tp> 810227825Stheraven_Tp 811227825Stheraven__num_get_signed_integral(const char* __a, const char* __a_end, 812227825Stheraven ios_base::iostate& __err, int __base) 813227825Stheraven{ 814227825Stheraven if (__a != __a_end) 815227825Stheraven { 816227825Stheraven int __save_errno = errno; 817227825Stheraven errno = 0; 818227825Stheraven char *__p2; 819227825Stheraven long long __ll = strtoll_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE); 820227825Stheraven int __current_errno = errno; 821227825Stheraven if (__current_errno == 0) 822227825Stheraven errno = __save_errno; 823227825Stheraven if (__p2 != __a_end) 824227825Stheraven { 825227825Stheraven __err = ios_base::failbit; 826227825Stheraven return 0; 827227825Stheraven } 828227825Stheraven else if (__current_errno == ERANGE || 829227825Stheraven __ll < numeric_limits<_Tp>::min() || 830227825Stheraven numeric_limits<_Tp>::max() < __ll) 831227825Stheraven { 832227825Stheraven __err = ios_base::failbit; 833227825Stheraven if (__ll > 0) 834227825Stheraven return numeric_limits<_Tp>::max(); 835227825Stheraven else 836227825Stheraven return numeric_limits<_Tp>::min(); 837227825Stheraven } 838227825Stheraven return static_cast<_Tp>(__ll); 839227825Stheraven } 840227825Stheraven __err = ios_base::failbit; 841227825Stheraven return 0; 842227825Stheraven} 843227825Stheraven 844227825Stheraventemplate <class _Tp> 845227825Stheraven_Tp 846227825Stheraven__num_get_unsigned_integral(const char* __a, const char* __a_end, 847227825Stheraven ios_base::iostate& __err, int __base) 848227825Stheraven{ 849227825Stheraven if (__a != __a_end) 850227825Stheraven { 851227825Stheraven if (*__a == '-') 852227825Stheraven { 853227825Stheraven __err = ios_base::failbit; 854227825Stheraven return 0; 855227825Stheraven } 856227825Stheraven int __save_errno = errno; 857227825Stheraven errno = 0; 858227825Stheraven char *__p2; 859227825Stheraven unsigned long long __ll = strtoull_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE); 860227825Stheraven int __current_errno = errno; 861227825Stheraven if (__current_errno == 0) 862227825Stheraven errno = __save_errno; 863227825Stheraven if (__p2 != __a_end) 864227825Stheraven { 865227825Stheraven __err = ios_base::failbit; 866227825Stheraven return 0; 867227825Stheraven } 868227825Stheraven else if (__current_errno == ERANGE || 869227825Stheraven numeric_limits<_Tp>::max() < __ll) 870227825Stheraven { 871227825Stheraven __err = ios_base::failbit; 872227825Stheraven return numeric_limits<_Tp>::max(); 873227825Stheraven } 874227825Stheraven return static_cast<_Tp>(__ll); 875227825Stheraven } 876227825Stheraven __err = ios_base::failbit; 877227825Stheraven return 0; 878227825Stheraven} 879227825Stheraven 880227825Stheraventemplate <class _Tp> 881227825Stheraven_Tp 882227825Stheraven__num_get_float(const char* __a, const char* __a_end, ios_base::iostate& __err) 883227825Stheraven{ 884227825Stheraven if (__a != __a_end) 885227825Stheraven { 886227825Stheraven char *__p2; 887227825Stheraven long double __ld = strtold_l(__a, &__p2, _LIBCPP_GET_C_LOCALE); 888227825Stheraven if (__p2 != __a_end) 889227825Stheraven { 890227825Stheraven __err = ios_base::failbit; 891227825Stheraven return 0; 892227825Stheraven } 893227825Stheraven return static_cast<_Tp>(__ld); 894227825Stheraven } 895227825Stheraven __err = ios_base::failbit; 896227825Stheraven return 0; 897227825Stheraven} 898227825Stheraven 899227825Stheraventemplate <class _CharT, class _InputIterator> 900227825Stheraven_InputIterator 901227825Stheravennum_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 902227825Stheraven ios_base& __iob, 903227825Stheraven ios_base::iostate& __err, 904227825Stheraven bool& __v) const 905227825Stheraven{ 906227825Stheraven if ((__iob.flags() & ios_base::boolalpha) == 0) 907227825Stheraven { 908227825Stheraven long __lv = -1; 909227825Stheraven __b = do_get(__b, __e, __iob, __err, __lv); 910227825Stheraven switch (__lv) 911227825Stheraven { 912227825Stheraven case 0: 913227825Stheraven __v = false; 914227825Stheraven break; 915227825Stheraven case 1: 916227825Stheraven __v = true; 917227825Stheraven break; 918227825Stheraven default: 919227825Stheraven __v = true; 920227825Stheraven __err = ios_base::failbit; 921227825Stheraven break; 922227825Stheraven } 923227825Stheraven return __b; 924227825Stheraven } 925227825Stheraven const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__iob.getloc()); 926227825Stheraven const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__iob.getloc()); 927227825Stheraven typedef typename numpunct<_CharT>::string_type string_type; 928227825Stheraven const string_type __names[2] = {__np.truename(), __np.falsename()}; 929227825Stheraven const string_type* __i = __scan_keyword(__b, __e, __names, __names+2, 930227825Stheraven __ct, __err); 931227825Stheraven __v = __i == __names; 932227825Stheraven return __b; 933227825Stheraven} 934227825Stheraven 935227825Stheraventemplate <class _CharT, class _InputIterator> 936227825Stheraven_InputIterator 937227825Stheravennum_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 938227825Stheraven ios_base& __iob, 939227825Stheraven ios_base::iostate& __err, 940227825Stheraven long& __v) const 941227825Stheraven{ 942227825Stheraven // Stage 1 943227825Stheraven int __base = this->__get_base(__iob); 944227825Stheraven // Stage 2 945227825Stheraven char_type __atoms[26]; 946227825Stheraven char_type __thousands_sep; 947227825Stheraven string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep); 948227825Stheraven char __a[__num_get_base::__num_get_buf_sz] = {0}; 949227825Stheraven char* __a_end = __a; 950227825Stheraven unsigned __g[__num_get_base::__num_get_buf_sz]; 951227825Stheraven unsigned* __g_end = __g; 952227825Stheraven unsigned __dc = 0; 953227825Stheraven for (; __b != __e; ++__b) 954227825Stheraven if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, 955227825Stheraven __thousands_sep, __grouping, __g, __g_end, 956227825Stheraven __atoms)) 957227825Stheraven break; 958227825Stheraven if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz) 959227825Stheraven *__g_end++ = __dc; 960227825Stheraven // Stage 3 961227825Stheraven __v = __num_get_signed_integral<long>(__a, __a_end, __err, __base); 962227825Stheraven // Digit grouping checked 963227825Stheraven __check_grouping(__grouping, __g, __g_end, __err); 964227825Stheraven // EOF checked 965227825Stheraven if (__b == __e) 966227825Stheraven __err |= ios_base::eofbit; 967227825Stheraven return __b; 968227825Stheraven} 969227825Stheraven 970227825Stheraventemplate <class _CharT, class _InputIterator> 971227825Stheraven_InputIterator 972227825Stheravennum_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 973227825Stheraven ios_base& __iob, 974227825Stheraven ios_base::iostate& __err, 975227825Stheraven long long& __v) const 976227825Stheraven{ 977227825Stheraven // Stage 1 978227825Stheraven int __base = this->__get_base(__iob); 979227825Stheraven // Stage 2 980227825Stheraven char_type __atoms[26]; 981227825Stheraven char_type __thousands_sep; 982227825Stheraven string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep); 983227825Stheraven char __a[__num_get_base::__num_get_buf_sz] = {0}; 984227825Stheraven char* __a_end = __a; 985227825Stheraven unsigned __g[__num_get_base::__num_get_buf_sz]; 986227825Stheraven unsigned* __g_end = __g; 987227825Stheraven unsigned __dc = 0; 988227825Stheraven for (; __b != __e; ++__b) 989227825Stheraven if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, 990227825Stheraven __thousands_sep, __grouping, __g, __g_end, 991227825Stheraven __atoms)) 992227825Stheraven break; 993227825Stheraven if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz) 994227825Stheraven *__g_end++ = __dc; 995227825Stheraven // Stage 3 996227825Stheraven __v = __num_get_signed_integral<long long>(__a, __a_end, __err, __base); 997227825Stheraven // Digit grouping checked 998227825Stheraven __check_grouping(__grouping, __g, __g_end, __err); 999227825Stheraven // EOF checked 1000227825Stheraven if (__b == __e) 1001227825Stheraven __err |= ios_base::eofbit; 1002227825Stheraven return __b; 1003227825Stheraven} 1004227825Stheraven 1005227825Stheraventemplate <class _CharT, class _InputIterator> 1006227825Stheraven_InputIterator 1007227825Stheravennum_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 1008227825Stheraven ios_base& __iob, 1009227825Stheraven ios_base::iostate& __err, 1010227825Stheraven unsigned short& __v) const 1011227825Stheraven{ 1012227825Stheraven // Stage 1 1013227825Stheraven int __base = this->__get_base(__iob); 1014227825Stheraven // Stage 2 1015227825Stheraven char_type __atoms[26]; 1016227825Stheraven char_type __thousands_sep; 1017227825Stheraven string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep); 1018227825Stheraven char __a[__num_get_base::__num_get_buf_sz] = {0}; 1019227825Stheraven char* __a_end = __a; 1020227825Stheraven unsigned __g[__num_get_base::__num_get_buf_sz]; 1021227825Stheraven unsigned* __g_end = __g; 1022227825Stheraven unsigned __dc = 0; 1023227825Stheraven for (; __b != __e; ++__b) 1024227825Stheraven if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, 1025227825Stheraven __thousands_sep, __grouping, __g, __g_end, 1026227825Stheraven __atoms)) 1027227825Stheraven break; 1028227825Stheraven if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz) 1029227825Stheraven *__g_end++ = __dc; 1030227825Stheraven // Stage 3 1031227825Stheraven __v = __num_get_unsigned_integral<unsigned short>(__a, __a_end, __err, __base); 1032227825Stheraven // Digit grouping checked 1033227825Stheraven __check_grouping(__grouping, __g, __g_end, __err); 1034227825Stheraven // EOF checked 1035227825Stheraven if (__b == __e) 1036227825Stheraven __err |= ios_base::eofbit; 1037227825Stheraven return __b; 1038227825Stheraven} 1039227825Stheraven 1040227825Stheraventemplate <class _CharT, class _InputIterator> 1041227825Stheraven_InputIterator 1042227825Stheravennum_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 1043227825Stheraven ios_base& __iob, 1044227825Stheraven ios_base::iostate& __err, 1045227825Stheraven unsigned int& __v) const 1046227825Stheraven{ 1047227825Stheraven // Stage 1 1048227825Stheraven int __base = this->__get_base(__iob); 1049227825Stheraven // Stage 2 1050227825Stheraven char_type __atoms[26]; 1051227825Stheraven char_type __thousands_sep; 1052227825Stheraven string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep); 1053227825Stheraven char __a[__num_get_base::__num_get_buf_sz] = {0}; 1054227825Stheraven char* __a_end = __a; 1055227825Stheraven unsigned __g[__num_get_base::__num_get_buf_sz]; 1056227825Stheraven unsigned* __g_end = __g; 1057227825Stheraven unsigned __dc = 0; 1058227825Stheraven for (; __b != __e; ++__b) 1059227825Stheraven if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, 1060227825Stheraven __thousands_sep, __grouping, __g, __g_end, 1061227825Stheraven __atoms)) 1062227825Stheraven break; 1063227825Stheraven if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz) 1064227825Stheraven *__g_end++ = __dc; 1065227825Stheraven // Stage 3 1066227825Stheraven __v = __num_get_unsigned_integral<unsigned int>(__a, __a_end, __err, __base); 1067227825Stheraven // Digit grouping checked 1068227825Stheraven __check_grouping(__grouping, __g, __g_end, __err); 1069227825Stheraven // EOF checked 1070227825Stheraven if (__b == __e) 1071227825Stheraven __err |= ios_base::eofbit; 1072227825Stheraven return __b; 1073227825Stheraven} 1074227825Stheraven 1075227825Stheraventemplate <class _CharT, class _InputIterator> 1076227825Stheraven_InputIterator 1077227825Stheravennum_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 1078227825Stheraven ios_base& __iob, 1079227825Stheraven ios_base::iostate& __err, 1080227825Stheraven unsigned long& __v) const 1081227825Stheraven{ 1082227825Stheraven // Stage 1 1083227825Stheraven int __base = this->__get_base(__iob); 1084227825Stheraven // Stage 2 1085227825Stheraven char_type __atoms[26]; 1086227825Stheraven char_type __thousands_sep; 1087227825Stheraven string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep); 1088227825Stheraven char __a[__num_get_base::__num_get_buf_sz] = {0}; 1089227825Stheraven char* __a_end = __a; 1090227825Stheraven unsigned __g[__num_get_base::__num_get_buf_sz]; 1091227825Stheraven unsigned* __g_end = __g; 1092227825Stheraven unsigned __dc = 0; 1093227825Stheraven for (; __b != __e; ++__b) 1094227825Stheraven if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, 1095227825Stheraven __thousands_sep, __grouping, __g, __g_end, 1096227825Stheraven __atoms)) 1097227825Stheraven break; 1098227825Stheraven if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz) 1099227825Stheraven *__g_end++ = __dc; 1100227825Stheraven // Stage 3 1101227825Stheraven __v = __num_get_unsigned_integral<unsigned long>(__a, __a_end, __err, __base); 1102227825Stheraven // Digit grouping checked 1103227825Stheraven __check_grouping(__grouping, __g, __g_end, __err); 1104227825Stheraven // EOF checked 1105227825Stheraven if (__b == __e) 1106227825Stheraven __err |= ios_base::eofbit; 1107227825Stheraven return __b; 1108227825Stheraven} 1109227825Stheraven 1110227825Stheraventemplate <class _CharT, class _InputIterator> 1111227825Stheraven_InputIterator 1112227825Stheravennum_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 1113227825Stheraven ios_base& __iob, 1114227825Stheraven ios_base::iostate& __err, 1115227825Stheraven unsigned long long& __v) const 1116227825Stheraven{ 1117227825Stheraven // Stage 1 1118227825Stheraven int __base = this->__get_base(__iob); 1119227825Stheraven // Stage 2 1120227825Stheraven char_type __atoms[26]; 1121227825Stheraven char_type __thousands_sep; 1122227825Stheraven string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep); 1123227825Stheraven char __a[__num_get_base::__num_get_buf_sz] = {0}; 1124227825Stheraven char* __a_end = __a; 1125227825Stheraven unsigned __g[__num_get_base::__num_get_buf_sz]; 1126227825Stheraven unsigned* __g_end = __g; 1127227825Stheraven unsigned __dc = 0; 1128227825Stheraven for (; __b != __e; ++__b) 1129227825Stheraven if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, 1130227825Stheraven __thousands_sep, __grouping, __g, __g_end, 1131227825Stheraven __atoms)) 1132227825Stheraven break; 1133227825Stheraven if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz) 1134227825Stheraven *__g_end++ = __dc; 1135227825Stheraven // Stage 3 1136227825Stheraven __v = __num_get_unsigned_integral<unsigned long long>(__a, __a_end, __err, __base); 1137227825Stheraven // Digit grouping checked 1138227825Stheraven __check_grouping(__grouping, __g, __g_end, __err); 1139227825Stheraven // EOF checked 1140227825Stheraven if (__b == __e) 1141227825Stheraven __err |= ios_base::eofbit; 1142227825Stheraven return __b; 1143227825Stheraven} 1144227825Stheraven 1145227825Stheraventemplate <class _CharT, class _InputIterator> 1146227825Stheraven_InputIterator 1147227825Stheravennum_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 1148227825Stheraven ios_base& __iob, 1149227825Stheraven ios_base::iostate& __err, 1150227825Stheraven float& __v) const 1151227825Stheraven{ 1152227825Stheraven // Stage 1, nothing to do 1153227825Stheraven // Stage 2 1154227825Stheraven char_type __atoms[32]; 1155227825Stheraven char_type __decimal_point; 1156227825Stheraven char_type __thousands_sep; 1157227825Stheraven string __grouping = this->__stage2_float_prep(__iob, __atoms, 1158227825Stheraven __decimal_point, 1159227825Stheraven __thousands_sep); 1160227825Stheraven char __a[__num_get_base::__num_get_buf_sz] = {0}; 1161227825Stheraven char* __a_end = __a; 1162227825Stheraven unsigned __g[__num_get_base::__num_get_buf_sz]; 1163227825Stheraven unsigned* __g_end = __g; 1164227825Stheraven unsigned __dc = 0; 1165227825Stheraven bool __in_units = true; 1166227825Stheraven char __exp = 'E'; 1167227825Stheraven for (; __b != __e; ++__b) 1168227825Stheraven if (this->__stage2_float_loop(*__b, __in_units, __exp, __a, __a_end, 1169227825Stheraven __decimal_point, __thousands_sep, 1170227825Stheraven __grouping, __g, __g_end, 1171227825Stheraven __dc, __atoms)) 1172227825Stheraven break; 1173227825Stheraven if (__grouping.size() != 0 && __in_units && __g_end-__g < __num_get_base::__num_get_buf_sz) 1174227825Stheraven *__g_end++ = __dc; 1175227825Stheraven // Stage 3 1176227825Stheraven __v = __num_get_float<float>(__a, __a_end, __err); 1177227825Stheraven // Digit grouping checked 1178227825Stheraven __check_grouping(__grouping, __g, __g_end, __err); 1179227825Stheraven // EOF checked 1180227825Stheraven if (__b == __e) 1181227825Stheraven __err |= ios_base::eofbit; 1182227825Stheraven return __b; 1183227825Stheraven} 1184227825Stheraven 1185227825Stheraventemplate <class _CharT, class _InputIterator> 1186227825Stheraven_InputIterator 1187227825Stheravennum_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 1188227825Stheraven ios_base& __iob, 1189227825Stheraven ios_base::iostate& __err, 1190227825Stheraven double& __v) const 1191227825Stheraven{ 1192227825Stheraven // Stage 1, nothing to do 1193227825Stheraven // Stage 2 1194227825Stheraven char_type __atoms[32]; 1195227825Stheraven char_type __decimal_point; 1196227825Stheraven char_type __thousands_sep; 1197227825Stheraven string __grouping = this->__stage2_float_prep(__iob, __atoms, 1198227825Stheraven __decimal_point, 1199227825Stheraven __thousands_sep); 1200227825Stheraven char __a[__num_get_base::__num_get_buf_sz] = {0}; 1201227825Stheraven char* __a_end = __a; 1202227825Stheraven unsigned __g[__num_get_base::__num_get_buf_sz]; 1203227825Stheraven unsigned* __g_end = __g; 1204227825Stheraven unsigned __dc = 0; 1205227825Stheraven bool __in_units = true; 1206227825Stheraven char __exp = 'E'; 1207227825Stheraven for (; __b != __e; ++__b) 1208227825Stheraven if (this->__stage2_float_loop(*__b, __in_units, __exp, __a, __a_end, 1209227825Stheraven __decimal_point, __thousands_sep, 1210227825Stheraven __grouping, __g, __g_end, 1211227825Stheraven __dc, __atoms)) 1212227825Stheraven break; 1213227825Stheraven if (__grouping.size() != 0 && __in_units && __g_end-__g < __num_get_base::__num_get_buf_sz) 1214227825Stheraven *__g_end++ = __dc; 1215227825Stheraven // Stage 3 1216227825Stheraven __v = __num_get_float<double>(__a, __a_end, __err); 1217227825Stheraven // Digit grouping checked 1218227825Stheraven __check_grouping(__grouping, __g, __g_end, __err); 1219227825Stheraven // EOF checked 1220227825Stheraven if (__b == __e) 1221227825Stheraven __err |= ios_base::eofbit; 1222227825Stheraven return __b; 1223227825Stheraven} 1224227825Stheraven 1225227825Stheraventemplate <class _CharT, class _InputIterator> 1226227825Stheraven_InputIterator 1227227825Stheravennum_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 1228227825Stheraven ios_base& __iob, 1229227825Stheraven ios_base::iostate& __err, 1230227825Stheraven long double& __v) const 1231227825Stheraven{ 1232227825Stheraven // Stage 1, nothing to do 1233227825Stheraven // Stage 2 1234227825Stheraven char_type __atoms[32]; 1235227825Stheraven char_type __decimal_point; 1236227825Stheraven char_type __thousands_sep; 1237227825Stheraven string __grouping = this->__stage2_float_prep(__iob, __atoms, 1238227825Stheraven __decimal_point, 1239227825Stheraven __thousands_sep); 1240227825Stheraven char __a[__num_get_base::__num_get_buf_sz] = {0}; 1241227825Stheraven char* __a_end = __a; 1242227825Stheraven unsigned __g[__num_get_base::__num_get_buf_sz]; 1243227825Stheraven unsigned* __g_end = __g; 1244227825Stheraven unsigned __dc = 0; 1245227825Stheraven bool __in_units = true; 1246227825Stheraven char __exp = 'E'; 1247227825Stheraven for (; __b != __e; ++__b) 1248227825Stheraven if (this->__stage2_float_loop(*__b, __in_units, __exp, __a, __a_end, 1249227825Stheraven __decimal_point, __thousands_sep, 1250227825Stheraven __grouping, __g, __g_end, 1251227825Stheraven __dc, __atoms)) 1252227825Stheraven break; 1253227825Stheraven if (__grouping.size() != 0 && __in_units && __g_end-__g < __num_get_base::__num_get_buf_sz) 1254227825Stheraven *__g_end++ = __dc; 1255227825Stheraven // Stage 3 1256227825Stheraven __v = __num_get_float<long double>(__a, __a_end, __err); 1257227825Stheraven // Digit grouping checked 1258227825Stheraven __check_grouping(__grouping, __g, __g_end, __err); 1259227825Stheraven // EOF checked 1260227825Stheraven if (__b == __e) 1261227825Stheraven __err |= ios_base::eofbit; 1262227825Stheraven return __b; 1263227825Stheraven} 1264227825Stheraven 1265227825Stheraventemplate <class _CharT, class _InputIterator> 1266227825Stheraven_InputIterator 1267227825Stheravennum_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 1268227825Stheraven ios_base& __iob, 1269227825Stheraven ios_base::iostate& __err, 1270227825Stheraven void*& __v) const 1271227825Stheraven{ 1272227825Stheraven // Stage 1 1273227825Stheraven int __base = 16; 1274227825Stheraven // Stage 2 1275227825Stheraven char_type __atoms[26]; 1276227825Stheraven char_type __thousands_sep; 1277227825Stheraven string __grouping; 1278227825Stheraven use_facet<ctype<_CharT> >(__iob.getloc()).widen(__num_get_base::__src, 1279227825Stheraven __num_get_base::__src + 26, __atoms); 1280227825Stheraven char __a[__num_get_base::__num_get_buf_sz] = {0}; 1281227825Stheraven char* __a_end = __a; 1282227825Stheraven unsigned __g[__num_get_base::__num_get_buf_sz]; 1283227825Stheraven unsigned* __g_end = __g; 1284227825Stheraven unsigned __dc = 0; 1285227825Stheraven for (; __b != __e; ++__b) 1286227825Stheraven if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, 1287227825Stheraven __thousands_sep, __grouping, 1288227825Stheraven __g, __g_end, __atoms)) 1289227825Stheraven break; 1290227825Stheraven // Stage 3 1291227825Stheraven __a[sizeof(__a)-1] = 0; 1292227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1293227825Stheraven if (sscanf_l(__a, _LIBCPP_GET_C_LOCALE, "%p", &__v) != 1) 1294227825Stheraven#else 1295227825Stheraven if (__sscanf_l(__a, __cloc(), "%p", &__v) != 1) 1296227825Stheraven#endif 1297227825Stheraven __err = ios_base::failbit; 1298227825Stheraven // EOF checked 1299227825Stheraven if (__b == __e) 1300227825Stheraven __err |= ios_base::eofbit; 1301227825Stheraven return __b; 1302227825Stheraven} 1303227825Stheraven 1304227825Stheravenextern template class num_get<char>; 1305227825Stheravenextern template class num_get<wchar_t>; 1306227825Stheraven 1307227825Stheravenstruct __num_put_base 1308227825Stheraven{ 1309227825Stheravenprotected: 1310227825Stheraven static void __format_int(char* __fmt, const char* __len, bool __signd, 1311227825Stheraven ios_base::fmtflags __flags); 1312227825Stheraven static bool __format_float(char* __fmt, const char* __len, 1313227825Stheraven ios_base::fmtflags __flags); 1314227825Stheraven static char* __identify_padding(char* __nb, char* __ne, 1315227825Stheraven const ios_base& __iob); 1316227825Stheraven}; 1317227825Stheraven 1318227825Stheraventemplate <class _CharT> 1319227825Stheravenstruct __num_put 1320227825Stheraven : protected __num_put_base 1321227825Stheraven{ 1322227825Stheraven static void __widen_and_group_int(char* __nb, char* __np, char* __ne, 1323227825Stheraven _CharT* __ob, _CharT*& __op, _CharT*& __oe, 1324227825Stheraven const locale& __loc); 1325227825Stheraven static void __widen_and_group_float(char* __nb, char* __np, char* __ne, 1326227825Stheraven _CharT* __ob, _CharT*& __op, _CharT*& __oe, 1327227825Stheraven const locale& __loc); 1328227825Stheraven}; 1329227825Stheraven 1330227825Stheraventemplate <class _CharT> 1331227825Stheravenvoid 1332227825Stheraven__num_put<_CharT>::__widen_and_group_int(char* __nb, char* __np, char* __ne, 1333227825Stheraven _CharT* __ob, _CharT*& __op, _CharT*& __oe, 1334227825Stheraven const locale& __loc) 1335227825Stheraven{ 1336227825Stheraven const ctype<_CharT>& __ct = use_facet<ctype<_CharT> > (__loc); 1337227825Stheraven const numpunct<_CharT>& __npt = use_facet<numpunct<_CharT> >(__loc); 1338227825Stheraven string __grouping = __npt.grouping(); 1339227825Stheraven if (__grouping.empty()) 1340227825Stheraven { 1341227825Stheraven __ct.widen(__nb, __ne, __ob); 1342227825Stheraven __oe = __ob + (__ne - __nb); 1343227825Stheraven } 1344227825Stheraven else 1345227825Stheraven { 1346227825Stheraven __oe = __ob; 1347227825Stheraven char* __nf = __nb; 1348227825Stheraven if (*__nf == '-' || *__nf == '+') 1349227825Stheraven *__oe++ = __ct.widen(*__nf++); 1350227825Stheraven if (__ne - __nf >= 2 && __nf[0] == '0' && (__nf[1] == 'x' || 1351227825Stheraven __nf[1] == 'X')) 1352227825Stheraven { 1353227825Stheraven *__oe++ = __ct.widen(*__nf++); 1354227825Stheraven *__oe++ = __ct.widen(*__nf++); 1355227825Stheraven } 1356227825Stheraven reverse(__nf, __ne); 1357227825Stheraven _CharT __thousands_sep = __npt.thousands_sep(); 1358227825Stheraven unsigned __dc = 0; 1359227825Stheraven unsigned __dg = 0; 1360227825Stheraven for (char* __p = __nf; __p < __ne; ++__p) 1361227825Stheraven { 1362227825Stheraven if (static_cast<unsigned>(__grouping[__dg]) > 0 && 1363227825Stheraven __dc == static_cast<unsigned>(__grouping[__dg])) 1364227825Stheraven { 1365227825Stheraven *__oe++ = __thousands_sep; 1366227825Stheraven __dc = 0; 1367227825Stheraven if (__dg < __grouping.size()-1) 1368227825Stheraven ++__dg; 1369227825Stheraven } 1370227825Stheraven *__oe++ = __ct.widen(*__p); 1371227825Stheraven ++__dc; 1372227825Stheraven } 1373227825Stheraven reverse(__ob + (__nf - __nb), __oe); 1374227825Stheraven } 1375227825Stheraven if (__np == __ne) 1376227825Stheraven __op = __oe; 1377227825Stheraven else 1378227825Stheraven __op = __ob + (__np - __nb); 1379227825Stheraven} 1380227825Stheraven 1381227825Stheraventemplate <class _CharT> 1382227825Stheravenvoid 1383227825Stheraven__num_put<_CharT>::__widen_and_group_float(char* __nb, char* __np, char* __ne, 1384227825Stheraven _CharT* __ob, _CharT*& __op, _CharT*& __oe, 1385227825Stheraven const locale& __loc) 1386227825Stheraven{ 1387227825Stheraven const ctype<_CharT>& __ct = use_facet<ctype<_CharT> > (__loc); 1388227825Stheraven const numpunct<_CharT>& __npt = use_facet<numpunct<_CharT> >(__loc); 1389227825Stheraven string __grouping = __npt.grouping(); 1390227825Stheraven __oe = __ob; 1391227825Stheraven char* __nf = __nb; 1392227825Stheraven if (*__nf == '-' || *__nf == '+') 1393227825Stheraven *__oe++ = __ct.widen(*__nf++); 1394227825Stheraven char* __ns; 1395227825Stheraven if (__ne - __nf >= 2 && __nf[0] == '0' && (__nf[1] == 'x' || 1396227825Stheraven __nf[1] == 'X')) 1397227825Stheraven { 1398227825Stheraven *__oe++ = __ct.widen(*__nf++); 1399227825Stheraven *__oe++ = __ct.widen(*__nf++); 1400227825Stheraven for (__ns = __nf; __ns < __ne; ++__ns) 1401227825Stheraven if (!isxdigit_l(*__ns, _LIBCPP_GET_C_LOCALE)) 1402227825Stheraven break; 1403227825Stheraven } 1404227825Stheraven else 1405227825Stheraven { 1406227825Stheraven for (__ns = __nf; __ns < __ne; ++__ns) 1407227825Stheraven if (!isdigit_l(*__ns, _LIBCPP_GET_C_LOCALE)) 1408227825Stheraven break; 1409227825Stheraven } 1410227825Stheraven if (__grouping.empty()) 1411227825Stheraven { 1412227825Stheraven __ct.widen(__nf, __ns, __oe); 1413227825Stheraven __oe += __ns - __nf; 1414227825Stheraven } 1415227825Stheraven else 1416227825Stheraven { 1417227825Stheraven reverse(__nf, __ns); 1418227825Stheraven _CharT __thousands_sep = __npt.thousands_sep(); 1419227825Stheraven unsigned __dc = 0; 1420227825Stheraven unsigned __dg = 0; 1421227825Stheraven for (char* __p = __nf; __p < __ns; ++__p) 1422227825Stheraven { 1423227825Stheraven if (__grouping[__dg] > 0 && __dc == static_cast<unsigned>(__grouping[__dg])) 1424227825Stheraven { 1425227825Stheraven *__oe++ = __thousands_sep; 1426227825Stheraven __dc = 0; 1427227825Stheraven if (__dg < __grouping.size()-1) 1428227825Stheraven ++__dg; 1429227825Stheraven } 1430227825Stheraven *__oe++ = __ct.widen(*__p); 1431227825Stheraven ++__dc; 1432227825Stheraven } 1433227825Stheraven reverse(__ob + (__nf - __nb), __oe); 1434227825Stheraven } 1435227825Stheraven for (__nf = __ns; __nf < __ne; ++__nf) 1436227825Stheraven { 1437227825Stheraven if (*__nf == '.') 1438227825Stheraven { 1439227825Stheraven *__oe++ = __npt.decimal_point(); 1440227825Stheraven ++__nf; 1441227825Stheraven break; 1442227825Stheraven } 1443227825Stheraven else 1444227825Stheraven *__oe++ = __ct.widen(*__nf); 1445227825Stheraven } 1446227825Stheraven __ct.widen(__nf, __ne, __oe); 1447227825Stheraven __oe += __ne - __nf; 1448227825Stheraven if (__np == __ne) 1449227825Stheraven __op = __oe; 1450227825Stheraven else 1451227825Stheraven __op = __ob + (__np - __nb); 1452227825Stheraven} 1453227825Stheraven 1454227825Stheravenextern template class __num_put<char>; 1455227825Stheravenextern template class __num_put<wchar_t>; 1456227825Stheraven 1457227825Stheraventemplate <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> > 1458227825Stheravenclass _LIBCPP_VISIBLE num_put 1459227825Stheraven : public locale::facet, 1460227825Stheraven private __num_put<_CharT> 1461227825Stheraven{ 1462227825Stheravenpublic: 1463227825Stheraven typedef _CharT char_type; 1464227825Stheraven typedef _OutputIterator iter_type; 1465227825Stheraven 1466227825Stheraven _LIBCPP_ALWAYS_INLINE 1467227825Stheraven explicit num_put(size_t __refs = 0) 1468227825Stheraven : locale::facet(__refs) {} 1469227825Stheraven 1470227825Stheraven _LIBCPP_ALWAYS_INLINE 1471227825Stheraven iter_type put(iter_type __s, ios_base& __iob, char_type __fl, 1472227825Stheraven bool __v) const 1473227825Stheraven { 1474227825Stheraven return do_put(__s, __iob, __fl, __v); 1475227825Stheraven } 1476227825Stheraven 1477227825Stheraven _LIBCPP_ALWAYS_INLINE 1478227825Stheraven iter_type put(iter_type __s, ios_base& __iob, char_type __fl, 1479227825Stheraven long __v) const 1480227825Stheraven { 1481227825Stheraven return do_put(__s, __iob, __fl, __v); 1482227825Stheraven } 1483227825Stheraven 1484227825Stheraven _LIBCPP_ALWAYS_INLINE 1485227825Stheraven iter_type put(iter_type __s, ios_base& __iob, char_type __fl, 1486227825Stheraven long long __v) const 1487227825Stheraven { 1488227825Stheraven return do_put(__s, __iob, __fl, __v); 1489227825Stheraven } 1490227825Stheraven 1491227825Stheraven _LIBCPP_ALWAYS_INLINE 1492227825Stheraven iter_type put(iter_type __s, ios_base& __iob, char_type __fl, 1493227825Stheraven unsigned long __v) const 1494227825Stheraven { 1495227825Stheraven return do_put(__s, __iob, __fl, __v); 1496227825Stheraven } 1497227825Stheraven 1498227825Stheraven _LIBCPP_ALWAYS_INLINE 1499227825Stheraven iter_type put(iter_type __s, ios_base& __iob, char_type __fl, 1500227825Stheraven unsigned long long __v) const 1501227825Stheraven { 1502227825Stheraven return do_put(__s, __iob, __fl, __v); 1503227825Stheraven } 1504227825Stheraven 1505227825Stheraven _LIBCPP_ALWAYS_INLINE 1506227825Stheraven iter_type put(iter_type __s, ios_base& __iob, char_type __fl, 1507227825Stheraven double __v) const 1508227825Stheraven { 1509227825Stheraven return do_put(__s, __iob, __fl, __v); 1510227825Stheraven } 1511227825Stheraven 1512227825Stheraven _LIBCPP_ALWAYS_INLINE 1513227825Stheraven iter_type put(iter_type __s, ios_base& __iob, char_type __fl, 1514227825Stheraven long double __v) const 1515227825Stheraven { 1516227825Stheraven return do_put(__s, __iob, __fl, __v); 1517227825Stheraven } 1518227825Stheraven 1519227825Stheraven _LIBCPP_ALWAYS_INLINE 1520227825Stheraven iter_type put(iter_type __s, ios_base& __iob, char_type __fl, 1521227825Stheraven const void* __v) const 1522227825Stheraven { 1523227825Stheraven return do_put(__s, __iob, __fl, __v); 1524227825Stheraven } 1525227825Stheraven 1526227825Stheraven static locale::id id; 1527227825Stheraven 1528227825Stheravenprotected: 1529227825Stheraven _LIBCPP_ALWAYS_INLINE 1530227825Stheraven ~num_put() {} 1531227825Stheraven 1532227825Stheraven virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, 1533227825Stheraven bool __v) const; 1534227825Stheraven virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, 1535227825Stheraven long __v) const; 1536227825Stheraven virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, 1537227825Stheraven long long __v) const; 1538227825Stheraven virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, 1539227825Stheraven unsigned long) const; 1540227825Stheraven virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, 1541227825Stheraven unsigned long long) const; 1542227825Stheraven virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, 1543227825Stheraven double __v) const; 1544227825Stheraven virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, 1545227825Stheraven long double __v) const; 1546227825Stheraven virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, 1547227825Stheraven const void* __v) const; 1548227825Stheraven}; 1549227825Stheraven 1550227825Stheraventemplate <class _CharT, class _OutputIterator> 1551227825Stheravenlocale::id 1552227825Stheravennum_put<_CharT, _OutputIterator>::id; 1553227825Stheraven 1554227825Stheraventemplate <class _CharT, class _OutputIterator> 1555227825Stheraven_LIBCPP_HIDDEN 1556227825Stheraven_OutputIterator 1557227825Stheraven__pad_and_output(_OutputIterator __s, 1558227825Stheraven const _CharT* __ob, const _CharT* __op, const _CharT* __oe, 1559227825Stheraven ios_base& __iob, _CharT __fl) 1560227825Stheraven{ 1561227825Stheraven streamsize __sz = __oe - __ob; 1562227825Stheraven streamsize __ns = __iob.width(); 1563227825Stheraven if (__ns > __sz) 1564227825Stheraven __ns -= __sz; 1565227825Stheraven else 1566227825Stheraven __ns = 0; 1567227825Stheraven for (;__ob < __op; ++__ob, ++__s) 1568227825Stheraven *__s = *__ob; 1569227825Stheraven for (; __ns; --__ns, ++__s) 1570227825Stheraven *__s = __fl; 1571227825Stheraven for (; __ob < __oe; ++__ob, ++__s) 1572227825Stheraven *__s = *__ob; 1573227825Stheraven __iob.width(0); 1574227825Stheraven return __s; 1575227825Stheraven} 1576227825Stheraven 1577227825Stheraventemplate <class _CharT, class _OutputIterator> 1578227825Stheraven_OutputIterator 1579227825Stheravennum_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, 1580227825Stheraven char_type __fl, bool __v) const 1581227825Stheraven{ 1582227825Stheraven if ((__iob.flags() & ios_base::boolalpha) == 0) 1583227825Stheraven return do_put(__s, __iob, __fl, (unsigned long)__v); 1584227825Stheraven const numpunct<char_type>& __np = use_facet<numpunct<char_type> >(__iob.getloc()); 1585227825Stheraven typedef typename numpunct<char_type>::string_type string_type; 1586227825Stheraven string_type __nm = __v ? __np.truename() : __np.falsename(); 1587227825Stheraven for (typename string_type::iterator __i = __nm.begin(); __i != __nm.end(); ++__i, ++__s) 1588227825Stheraven *__s = *__i; 1589227825Stheraven return __s; 1590227825Stheraven} 1591227825Stheraven 1592227825Stheraventemplate <class _CharT, class _OutputIterator> 1593227825Stheraven_OutputIterator 1594227825Stheravennum_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, 1595227825Stheraven char_type __fl, long __v) const 1596227825Stheraven{ 1597227825Stheraven // Stage 1 - Get number in narrow char 1598227825Stheraven char __fmt[6] = {'%', 0}; 1599227825Stheraven const char* __len = "l"; 1600227825Stheraven this->__format_int(__fmt+1, __len, true, __iob.flags()); 1601227825Stheraven const unsigned __nbuf = (numeric_limits<long>::digits / 3) 1602227825Stheraven + ((numeric_limits<long>::digits % 3) != 0) 1603227825Stheraven + 1; 1604227825Stheraven char __nar[__nbuf]; 1605227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1606227825Stheraven int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v); 1607227825Stheraven#else 1608227825Stheraven int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); 1609227825Stheraven#endif 1610227825Stheraven char* __ne = __nar + __nc; 1611227825Stheraven char* __np = this->__identify_padding(__nar, __ne, __iob); 1612227825Stheraven // Stage 2 - Widen __nar while adding thousands separators 1613227825Stheraven char_type __o[2*(__nbuf-1) - 1]; 1614227825Stheraven char_type* __op; // pad here 1615227825Stheraven char_type* __oe; // end of output 1616227825Stheraven this->__widen_and_group_int(__nar, __np, __ne, __o, __op, __oe, __iob.getloc()); 1617227825Stheraven // [__o, __oe) contains thousands_sep'd wide number 1618227825Stheraven // Stage 3 & 4 1619227825Stheraven return __pad_and_output(__s, __o, __op, __oe, __iob, __fl); 1620227825Stheraven} 1621227825Stheraven 1622227825Stheraventemplate <class _CharT, class _OutputIterator> 1623227825Stheraven_OutputIterator 1624227825Stheravennum_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, 1625227825Stheraven char_type __fl, long long __v) const 1626227825Stheraven{ 1627227825Stheraven // Stage 1 - Get number in narrow char 1628227825Stheraven char __fmt[8] = {'%', 0}; 1629227825Stheraven const char* __len = "ll"; 1630227825Stheraven this->__format_int(__fmt+1, __len, true, __iob.flags()); 1631227825Stheraven const unsigned __nbuf = (numeric_limits<long long>::digits / 3) 1632227825Stheraven + ((numeric_limits<long long>::digits % 3) != 0) 1633227825Stheraven + 1; 1634227825Stheraven char __nar[__nbuf]; 1635227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1636227825Stheraven int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v); 1637227825Stheraven#else 1638227825Stheraven int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); 1639227825Stheraven#endif 1640227825Stheraven char* __ne = __nar + __nc; 1641227825Stheraven char* __np = this->__identify_padding(__nar, __ne, __iob); 1642227825Stheraven // Stage 2 - Widen __nar while adding thousands separators 1643227825Stheraven char_type __o[2*(__nbuf-1) - 1]; 1644227825Stheraven char_type* __op; // pad here 1645227825Stheraven char_type* __oe; // end of output 1646227825Stheraven this->__widen_and_group_int(__nar, __np, __ne, __o, __op, __oe, __iob.getloc()); 1647227825Stheraven // [__o, __oe) contains thousands_sep'd wide number 1648227825Stheraven // Stage 3 & 4 1649227825Stheraven return __pad_and_output(__s, __o, __op, __oe, __iob, __fl); 1650227825Stheraven} 1651227825Stheraven 1652227825Stheraventemplate <class _CharT, class _OutputIterator> 1653227825Stheraven_OutputIterator 1654227825Stheravennum_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, 1655227825Stheraven char_type __fl, unsigned long __v) const 1656227825Stheraven{ 1657227825Stheraven // Stage 1 - Get number in narrow char 1658227825Stheraven char __fmt[6] = {'%', 0}; 1659227825Stheraven const char* __len = "l"; 1660227825Stheraven this->__format_int(__fmt+1, __len, false, __iob.flags()); 1661227825Stheraven const unsigned __nbuf = (numeric_limits<unsigned long>::digits / 3) 1662227825Stheraven + ((numeric_limits<unsigned long>::digits % 3) != 0) 1663227825Stheraven + 1; 1664227825Stheraven char __nar[__nbuf]; 1665227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1666227825Stheraven int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v); 1667227825Stheraven#else 1668227825Stheraven int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); 1669227825Stheraven#endif 1670227825Stheraven char* __ne = __nar + __nc; 1671227825Stheraven char* __np = this->__identify_padding(__nar, __ne, __iob); 1672227825Stheraven // Stage 2 - Widen __nar while adding thousands separators 1673227825Stheraven char_type __o[2*(__nbuf-1) - 1]; 1674227825Stheraven char_type* __op; // pad here 1675227825Stheraven char_type* __oe; // end of output 1676227825Stheraven this->__widen_and_group_int(__nar, __np, __ne, __o, __op, __oe, __iob.getloc()); 1677227825Stheraven // [__o, __oe) contains thousands_sep'd wide number 1678227825Stheraven // Stage 3 & 4 1679227825Stheraven return __pad_and_output(__s, __o, __op, __oe, __iob, __fl); 1680227825Stheraven} 1681227825Stheraven 1682227825Stheraventemplate <class _CharT, class _OutputIterator> 1683227825Stheraven_OutputIterator 1684227825Stheravennum_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, 1685227825Stheraven char_type __fl, unsigned long long __v) const 1686227825Stheraven{ 1687227825Stheraven // Stage 1 - Get number in narrow char 1688227825Stheraven char __fmt[8] = {'%', 0}; 1689227825Stheraven const char* __len = "ll"; 1690227825Stheraven this->__format_int(__fmt+1, __len, false, __iob.flags()); 1691227825Stheraven const unsigned __nbuf = (numeric_limits<unsigned long long>::digits / 3) 1692227825Stheraven + ((numeric_limits<unsigned long long>::digits % 3) != 0) 1693227825Stheraven + 1; 1694227825Stheraven char __nar[__nbuf]; 1695227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1696227825Stheraven int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v); 1697227825Stheraven#else 1698227825Stheraven int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); 1699227825Stheraven#endif 1700227825Stheraven char* __ne = __nar + __nc; 1701227825Stheraven char* __np = this->__identify_padding(__nar, __ne, __iob); 1702227825Stheraven // Stage 2 - Widen __nar while adding thousands separators 1703227825Stheraven char_type __o[2*(__nbuf-1) - 1]; 1704227825Stheraven char_type* __op; // pad here 1705227825Stheraven char_type* __oe; // end of output 1706227825Stheraven this->__widen_and_group_int(__nar, __np, __ne, __o, __op, __oe, __iob.getloc()); 1707227825Stheraven // [__o, __oe) contains thousands_sep'd wide number 1708227825Stheraven // Stage 3 & 4 1709227825Stheraven return __pad_and_output(__s, __o, __op, __oe, __iob, __fl); 1710227825Stheraven} 1711227825Stheraven 1712227825Stheraventemplate <class _CharT, class _OutputIterator> 1713227825Stheraven_OutputIterator 1714227825Stheravennum_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, 1715227825Stheraven char_type __fl, double __v) const 1716227825Stheraven{ 1717227825Stheraven // Stage 1 - Get number in narrow char 1718227825Stheraven char __fmt[8] = {'%', 0}; 1719227825Stheraven const char* __len = ""; 1720227825Stheraven bool __specify_precision = this->__format_float(__fmt+1, __len, __iob.flags()); 1721227825Stheraven const unsigned __nbuf = 30; 1722227825Stheraven char __nar[__nbuf]; 1723227825Stheraven char* __nb = __nar; 1724227825Stheraven int __nc; 1725227825Stheraven if (__specify_precision) 1726227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1727227825Stheraven __nc = snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, 1728227825Stheraven (int)__iob.precision(), __v); 1729227825Stheraven#else 1730227825Stheraven __nc = __snprintf_l(__nb, __nbuf, __cloc(), __fmt, 1731227825Stheraven (int)__iob.precision(), __v); 1732227825Stheraven#endif 1733227825Stheraven else 1734227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1735227825Stheraven __nc = snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, __v); 1736227825Stheraven#else 1737227825Stheraven __nc = __snprintf_l(__nb, __nbuf, __cloc(), __fmt, __v); 1738227825Stheraven#endif 1739227825Stheraven unique_ptr<char, void(*)(void*)> __nbh(0, free); 1740227825Stheraven if (__nc > static_cast<int>(__nbuf-1)) 1741227825Stheraven { 1742227825Stheraven if (__specify_precision) 1743227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1744227825Stheraven __nc = asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, (int)__iob.precision(), __v); 1745227825Stheraven#else 1746227825Stheraven __nc = __asprintf_l(&__nb, __cloc(), __fmt, 1747227825Stheraven (int)__iob.precision(), __v); 1748227825Stheraven#endif 1749227825Stheraven else 1750227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1751227825Stheraven __nc = asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, __v); 1752227825Stheraven#else 1753227825Stheraven __nc = __asprintf_l(&__nb, __cloc(), __fmt, (int)__iob.precision(), __v); 1754227825Stheraven#endif 1755227825Stheraven if (__nb == 0) 1756227825Stheraven __throw_bad_alloc(); 1757227825Stheraven __nbh.reset(__nb); 1758227825Stheraven } 1759227825Stheraven char* __ne = __nb + __nc; 1760227825Stheraven char* __np = this->__identify_padding(__nb, __ne, __iob); 1761227825Stheraven // Stage 2 - Widen __nar while adding thousands separators 1762227825Stheraven char_type __o[2*(__nbuf-1) - 1]; 1763227825Stheraven char_type* __ob = __o; 1764227825Stheraven unique_ptr<char_type, void(*)(void*)> __obh(0, free); 1765227825Stheraven if (__nb != __nar) 1766227825Stheraven { 1767227825Stheraven __ob = (char_type*)malloc((2*__nc)*sizeof(char_type)); 1768227825Stheraven if (__ob == 0) 1769227825Stheraven __throw_bad_alloc(); 1770227825Stheraven __obh.reset(__ob); 1771227825Stheraven } 1772227825Stheraven char_type* __op; // pad here 1773227825Stheraven char_type* __oe; // end of output 1774227825Stheraven this->__widen_and_group_float(__nb, __np, __ne, __ob, __op, __oe, __iob.getloc()); 1775227825Stheraven // [__o, __oe) contains thousands_sep'd wide number 1776227825Stheraven // Stage 3 & 4 1777227825Stheraven __s = __pad_and_output(__s, __ob, __op, __oe, __iob, __fl); 1778227825Stheraven return __s; 1779227825Stheraven} 1780227825Stheraven 1781227825Stheraventemplate <class _CharT, class _OutputIterator> 1782227825Stheraven_OutputIterator 1783227825Stheravennum_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, 1784227825Stheraven char_type __fl, long double __v) const 1785227825Stheraven{ 1786227825Stheraven // Stage 1 - Get number in narrow char 1787227825Stheraven char __fmt[8] = {'%', 0}; 1788227825Stheraven const char* __len = "L"; 1789227825Stheraven bool __specify_precision = this->__format_float(__fmt+1, __len, __iob.flags()); 1790227825Stheraven const unsigned __nbuf = 30; 1791227825Stheraven char __nar[__nbuf]; 1792227825Stheraven char* __nb = __nar; 1793227825Stheraven int __nc; 1794227825Stheraven if (__specify_precision) 1795227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1796227825Stheraven __nc = snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, 1797227825Stheraven (int)__iob.precision(), __v); 1798227825Stheraven#else 1799227825Stheraven __nc = __snprintf_l(__nb, __nbuf, __cloc(), __fmt, 1800227825Stheraven (int)__iob.precision(), __v); 1801227825Stheraven#endif 1802227825Stheraven else 1803227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1804227825Stheraven __nc = snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, __v); 1805227825Stheraven#else 1806227825Stheraven __nc = __snprintf_l(__nb, __nbuf, __cloc(), __fmt, __v); 1807227825Stheraven#endif 1808227825Stheraven unique_ptr<char, void(*)(void*)> __nbh(0, free); 1809227825Stheraven if (__nc > static_cast<int>(__nbuf-1)) 1810227825Stheraven { 1811227825Stheraven if (__specify_precision) 1812227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1813227825Stheraven __nc = asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, (int)__iob.precision(), __v); 1814227825Stheraven#else 1815227825Stheraven __nc = __asprintf_l(&__nb, __cloc(), __fmt, 1816227825Stheraven (int)__iob.precision(), __v); 1817227825Stheraven#endif 1818227825Stheraven else 1819227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1820227825Stheraven __nc = asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, __v); 1821227825Stheraven#else 1822227825Stheraven __nc = __asprintf_l(&__nb, __cloc(), __fmt, __v); 1823227825Stheraven#endif 1824227825Stheraven if (__nb == 0) 1825227825Stheraven __throw_bad_alloc(); 1826227825Stheraven __nbh.reset(__nb); 1827227825Stheraven } 1828227825Stheraven char* __ne = __nb + __nc; 1829227825Stheraven char* __np = this->__identify_padding(__nb, __ne, __iob); 1830227825Stheraven // Stage 2 - Widen __nar while adding thousands separators 1831227825Stheraven char_type __o[2*(__nbuf-1) - 1]; 1832227825Stheraven char_type* __ob = __o; 1833227825Stheraven unique_ptr<char_type, void(*)(void*)> __obh(0, free); 1834227825Stheraven if (__nb != __nar) 1835227825Stheraven { 1836227825Stheraven __ob = (char_type*)malloc((2*__nc)*sizeof(char_type)); 1837227825Stheraven if (__ob == 0) 1838227825Stheraven __throw_bad_alloc(); 1839227825Stheraven __obh.reset(__ob); 1840227825Stheraven } 1841227825Stheraven char_type* __op; // pad here 1842227825Stheraven char_type* __oe; // end of output 1843227825Stheraven this->__widen_and_group_float(__nb, __np, __ne, __ob, __op, __oe, __iob.getloc()); 1844227825Stheraven // [__o, __oe) contains thousands_sep'd wide number 1845227825Stheraven // Stage 3 & 4 1846227825Stheraven __s = __pad_and_output(__s, __ob, __op, __oe, __iob, __fl); 1847227825Stheraven return __s; 1848227825Stheraven} 1849227825Stheraven 1850227825Stheraventemplate <class _CharT, class _OutputIterator> 1851227825Stheraven_OutputIterator 1852227825Stheravennum_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, 1853227825Stheraven char_type __fl, const void* __v) const 1854227825Stheraven{ 1855227825Stheraven // Stage 1 - Get pointer in narrow char 1856227825Stheraven char __fmt[6] = "%p"; 1857227825Stheraven const unsigned __nbuf = 20; 1858227825Stheraven char __nar[__nbuf]; 1859227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 1860227825Stheraven int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v); 1861227825Stheraven#else 1862227825Stheraven int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); 1863227825Stheraven#endif 1864227825Stheraven char* __ne = __nar + __nc; 1865227825Stheraven char* __np = this->__identify_padding(__nar, __ne, __iob); 1866227825Stheraven // Stage 2 - Widen __nar 1867227825Stheraven char_type __o[2*(__nbuf-1) - 1]; 1868227825Stheraven char_type* __op; // pad here 1869227825Stheraven char_type* __oe; // end of output 1870227825Stheraven const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); 1871227825Stheraven __ct.widen(__nar, __ne, __o); 1872227825Stheraven __oe = __o + (__ne - __nar); 1873227825Stheraven if (__np == __ne) 1874227825Stheraven __op = __oe; 1875227825Stheraven else 1876227825Stheraven __op = __o + (__np - __nar); 1877227825Stheraven // [__o, __oe) contains wide number 1878227825Stheraven // Stage 3 & 4 1879227825Stheraven return __pad_and_output(__s, __o, __op, __oe, __iob, __fl); 1880227825Stheraven} 1881227825Stheraven 1882227825Stheravenextern template class num_put<char>; 1883227825Stheravenextern template class num_put<wchar_t>; 1884227825Stheraven 1885227825Stheraventemplate <class _CharT, class _InputIterator> 1886227825Stheraven_LIBCPP_HIDDEN 1887227825Stheravenint 1888227825Stheraven__get_up_to_n_digits(_InputIterator& __b, _InputIterator __e, 1889227825Stheraven ios_base::iostate& __err, const ctype<_CharT>& __ct, int __n) 1890227825Stheraven{ 1891227825Stheraven // Precondition: __n >= 1 1892227825Stheraven if (__b == __e) 1893227825Stheraven { 1894227825Stheraven __err |= ios_base::eofbit | ios_base::failbit; 1895227825Stheraven return 0; 1896227825Stheraven } 1897227825Stheraven // get first digit 1898227825Stheraven _CharT __c = *__b; 1899227825Stheraven if (!__ct.is(ctype_base::digit, __c)) 1900227825Stheraven { 1901227825Stheraven __err |= ios_base::failbit; 1902227825Stheraven return 0; 1903227825Stheraven } 1904227825Stheraven int __r = __ct.narrow(__c, 0) - '0'; 1905227825Stheraven for (++__b, --__n; __b != __e && __n > 0; ++__b, --__n) 1906227825Stheraven { 1907227825Stheraven // get next digit 1908227825Stheraven __c = *__b; 1909227825Stheraven if (!__ct.is(ctype_base::digit, __c)) 1910227825Stheraven return __r; 1911227825Stheraven __r = __r * 10 + __ct.narrow(__c, 0) - '0'; 1912227825Stheraven } 1913227825Stheraven if (__b == __e) 1914227825Stheraven __err |= ios_base::eofbit; 1915227825Stheraven return __r; 1916227825Stheraven} 1917227825Stheraven 1918227825Stheravenclass _LIBCPP_VISIBLE time_base 1919227825Stheraven{ 1920227825Stheravenpublic: 1921227825Stheraven enum dateorder {no_order, dmy, mdy, ymd, ydm}; 1922227825Stheraven}; 1923227825Stheraven 1924227825Stheraventemplate <class _CharT> 1925227825Stheravenclass __time_get_c_storage // purposefully not decorated 1926227825Stheraven{ 1927227825Stheravenprotected: 1928227825Stheraven typedef basic_string<_CharT> string_type; 1929227825Stheraven 1930227825Stheraven virtual const string_type* __weeks() const; 1931227825Stheraven virtual const string_type* __months() const; 1932227825Stheraven virtual const string_type* __am_pm() const; 1933227825Stheraven virtual const string_type& __c() const; 1934227825Stheraven virtual const string_type& __r() const; 1935227825Stheraven virtual const string_type& __x() const; 1936227825Stheraven virtual const string_type& __X() const; 1937227825Stheraven}; 1938227825Stheraven 1939227825Stheraventemplate <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> > 1940227825Stheravenclass _LIBCPP_VISIBLE time_get 1941227825Stheraven : public locale::facet, 1942227825Stheraven public time_base, 1943227825Stheraven private __time_get_c_storage<_CharT> 1944227825Stheraven{ 1945227825Stheravenpublic: 1946227825Stheraven typedef _CharT char_type; 1947227825Stheraven typedef _InputIterator iter_type; 1948227825Stheraven typedef time_base::dateorder dateorder; 1949227825Stheraven typedef basic_string<char_type> string_type; 1950227825Stheraven 1951227825Stheraven _LIBCPP_ALWAYS_INLINE 1952227825Stheraven explicit time_get(size_t __refs = 0) 1953227825Stheraven : locale::facet(__refs) {} 1954227825Stheraven 1955227825Stheraven _LIBCPP_ALWAYS_INLINE 1956227825Stheraven dateorder date_order() const 1957227825Stheraven { 1958227825Stheraven return this->do_date_order(); 1959227825Stheraven } 1960227825Stheraven 1961227825Stheraven _LIBCPP_ALWAYS_INLINE 1962227825Stheraven iter_type get_time(iter_type __b, iter_type __e, ios_base& __iob, 1963227825Stheraven ios_base::iostate& __err, tm* __tm) const 1964227825Stheraven { 1965227825Stheraven return do_get_time(__b, __e, __iob, __err, __tm); 1966227825Stheraven } 1967227825Stheraven 1968227825Stheraven _LIBCPP_ALWAYS_INLINE 1969227825Stheraven iter_type get_date(iter_type __b, iter_type __e, ios_base& __iob, 1970227825Stheraven ios_base::iostate& __err, tm* __tm) const 1971227825Stheraven { 1972227825Stheraven return do_get_date(__b, __e, __iob, __err, __tm); 1973227825Stheraven } 1974227825Stheraven 1975227825Stheraven _LIBCPP_ALWAYS_INLINE 1976227825Stheraven iter_type get_weekday(iter_type __b, iter_type __e, ios_base& __iob, 1977227825Stheraven ios_base::iostate& __err, tm* __tm) const 1978227825Stheraven { 1979227825Stheraven return do_get_weekday(__b, __e, __iob, __err, __tm); 1980227825Stheraven } 1981227825Stheraven 1982227825Stheraven _LIBCPP_ALWAYS_INLINE 1983227825Stheraven iter_type get_monthname(iter_type __b, iter_type __e, ios_base& __iob, 1984227825Stheraven ios_base::iostate& __err, tm* __tm) const 1985227825Stheraven { 1986227825Stheraven return do_get_monthname(__b, __e, __iob, __err, __tm); 1987227825Stheraven } 1988227825Stheraven 1989227825Stheraven _LIBCPP_ALWAYS_INLINE 1990227825Stheraven iter_type get_year(iter_type __b, iter_type __e, ios_base& __iob, 1991227825Stheraven ios_base::iostate& __err, tm* __tm) const 1992227825Stheraven { 1993227825Stheraven return do_get_year(__b, __e, __iob, __err, __tm); 1994227825Stheraven } 1995227825Stheraven 1996227825Stheraven _LIBCPP_ALWAYS_INLINE 1997227825Stheraven iter_type get(iter_type __b, iter_type __e, ios_base& __iob, 1998227825Stheraven ios_base::iostate& __err, tm *__tm, 1999227825Stheraven char __fmt, char __mod = 0) const 2000227825Stheraven { 2001227825Stheraven return do_get(__b, __e, __iob, __err, __tm, __fmt, __mod); 2002227825Stheraven } 2003227825Stheraven 2004227825Stheraven iter_type get(iter_type __b, iter_type __e, ios_base& __iob, 2005227825Stheraven ios_base::iostate& __err, tm* __tm, 2006227825Stheraven const char_type* __fmtb, const char_type* __fmte) const; 2007227825Stheraven 2008227825Stheraven static locale::id id; 2009227825Stheraven 2010227825Stheravenprotected: 2011227825Stheraven _LIBCPP_ALWAYS_INLINE 2012227825Stheraven ~time_get() {} 2013227825Stheraven 2014227825Stheraven virtual dateorder do_date_order() const; 2015227825Stheraven virtual iter_type do_get_time(iter_type __b, iter_type __e, ios_base& __iob, 2016227825Stheraven ios_base::iostate& __err, tm* __tm) const; 2017227825Stheraven virtual iter_type do_get_date(iter_type __b, iter_type __e, ios_base& __iob, 2018227825Stheraven ios_base::iostate& __err, tm* __tm) const; 2019227825Stheraven virtual iter_type do_get_weekday(iter_type __b, iter_type __e, ios_base& __iob, 2020227825Stheraven ios_base::iostate& __err, tm* __tm) const; 2021227825Stheraven virtual iter_type do_get_monthname(iter_type __b, iter_type __e, ios_base& __iob, 2022227825Stheraven ios_base::iostate& __err, tm* __tm) const; 2023227825Stheraven virtual iter_type do_get_year(iter_type __b, iter_type __e, ios_base& __iob, 2024227825Stheraven ios_base::iostate& __err, tm* __tm) const; 2025227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, 2026227825Stheraven ios_base::iostate& __err, tm* __tm, 2027227825Stheraven char __fmt, char __mod) const; 2028227825Stheravenprivate: 2029227825Stheraven void __get_white_space(iter_type& __b, iter_type __e, 2030227825Stheraven ios_base::iostate& __err, const ctype<char_type>& __ct) const; 2031227825Stheraven void __get_percent(iter_type& __b, iter_type __e, ios_base::iostate& __err, 2032227825Stheraven const ctype<char_type>& __ct) const; 2033227825Stheraven 2034227825Stheraven void __get_weekdayname(int& __m, 2035227825Stheraven iter_type& __b, iter_type __e, 2036227825Stheraven ios_base::iostate& __err, 2037227825Stheraven const ctype<char_type>& __ct) const; 2038227825Stheraven void __get_monthname(int& __m, 2039227825Stheraven iter_type& __b, iter_type __e, 2040227825Stheraven ios_base::iostate& __err, 2041227825Stheraven const ctype<char_type>& __ct) const; 2042227825Stheraven void __get_day(int& __d, 2043227825Stheraven iter_type& __b, iter_type __e, 2044227825Stheraven ios_base::iostate& __err, 2045227825Stheraven const ctype<char_type>& __ct) const; 2046227825Stheraven void __get_month(int& __m, 2047227825Stheraven iter_type& __b, iter_type __e, 2048227825Stheraven ios_base::iostate& __err, 2049227825Stheraven const ctype<char_type>& __ct) const; 2050227825Stheraven void __get_year(int& __y, 2051227825Stheraven iter_type& __b, iter_type __e, 2052227825Stheraven ios_base::iostate& __err, 2053227825Stheraven const ctype<char_type>& __ct) const; 2054227825Stheraven void __get_year4(int& __y, 2055227825Stheraven iter_type& __b, iter_type __e, 2056227825Stheraven ios_base::iostate& __err, 2057227825Stheraven const ctype<char_type>& __ct) const; 2058227825Stheraven void __get_hour(int& __d, 2059227825Stheraven iter_type& __b, iter_type __e, 2060227825Stheraven ios_base::iostate& __err, 2061227825Stheraven const ctype<char_type>& __ct) const; 2062227825Stheraven void __get_12_hour(int& __h, 2063227825Stheraven iter_type& __b, iter_type __e, 2064227825Stheraven ios_base::iostate& __err, 2065227825Stheraven const ctype<char_type>& __ct) const; 2066227825Stheraven void __get_am_pm(int& __h, 2067227825Stheraven iter_type& __b, iter_type __e, 2068227825Stheraven ios_base::iostate& __err, 2069227825Stheraven const ctype<char_type>& __ct) const; 2070227825Stheraven void __get_minute(int& __m, 2071227825Stheraven iter_type& __b, iter_type __e, 2072227825Stheraven ios_base::iostate& __err, 2073227825Stheraven const ctype<char_type>& __ct) const; 2074227825Stheraven void __get_second(int& __s, 2075227825Stheraven iter_type& __b, iter_type __e, 2076227825Stheraven ios_base::iostate& __err, 2077227825Stheraven const ctype<char_type>& __ct) const; 2078227825Stheraven void __get_weekday(int& __w, 2079227825Stheraven iter_type& __b, iter_type __e, 2080227825Stheraven ios_base::iostate& __err, 2081227825Stheraven const ctype<char_type>& __ct) const; 2082227825Stheraven void __get_day_year_num(int& __w, 2083227825Stheraven iter_type& __b, iter_type __e, 2084227825Stheraven ios_base::iostate& __err, 2085227825Stheraven const ctype<char_type>& __ct) const; 2086227825Stheraven}; 2087227825Stheraven 2088227825Stheraventemplate <class _CharT, class _InputIterator> 2089227825Stheravenlocale::id 2090227825Stheraventime_get<_CharT, _InputIterator>::id; 2091227825Stheraven 2092227825Stheraven// time_get primatives 2093227825Stheraven 2094227825Stheraventemplate <class _CharT, class _InputIterator> 2095227825Stheravenvoid 2096227825Stheraventime_get<_CharT, _InputIterator>::__get_weekdayname(int& __w, 2097227825Stheraven iter_type& __b, iter_type __e, 2098227825Stheraven ios_base::iostate& __err, 2099227825Stheraven const ctype<char_type>& __ct) const 2100227825Stheraven{ 2101227825Stheraven // Note: ignoring case comes from the POSIX strptime spec 2102227825Stheraven const string_type* __wk = this->__weeks(); 2103227825Stheraven int __i = __scan_keyword(__b, __e, __wk, __wk+14, __ct, __err, false) - __wk; 2104227825Stheraven if (__i < 14) 2105227825Stheraven __w = __i % 7; 2106227825Stheraven} 2107227825Stheraven 2108227825Stheraventemplate <class _CharT, class _InputIterator> 2109227825Stheravenvoid 2110227825Stheraventime_get<_CharT, _InputIterator>::__get_monthname(int& __m, 2111227825Stheraven iter_type& __b, iter_type __e, 2112227825Stheraven ios_base::iostate& __err, 2113227825Stheraven const ctype<char_type>& __ct) const 2114227825Stheraven{ 2115227825Stheraven // Note: ignoring case comes from the POSIX strptime spec 2116227825Stheraven const string_type* __month = this->__months(); 2117227825Stheraven int __i = __scan_keyword(__b, __e, __month, __month+24, __ct, __err, false) - __month; 2118227825Stheraven if (__i < 24) 2119227825Stheraven __m = __i % 12; 2120227825Stheraven} 2121227825Stheraven 2122227825Stheraventemplate <class _CharT, class _InputIterator> 2123227825Stheravenvoid 2124227825Stheraventime_get<_CharT, _InputIterator>::__get_day(int& __d, 2125227825Stheraven iter_type& __b, iter_type __e, 2126227825Stheraven ios_base::iostate& __err, 2127227825Stheraven const ctype<char_type>& __ct) const 2128227825Stheraven{ 2129227825Stheraven int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2); 2130227825Stheraven if (!(__err & ios_base::failbit) && 1 <= __t && __t <= 31) 2131227825Stheraven __d = __t; 2132227825Stheraven else 2133227825Stheraven __err |= ios_base::failbit; 2134227825Stheraven} 2135227825Stheraven 2136227825Stheraventemplate <class _CharT, class _InputIterator> 2137227825Stheravenvoid 2138227825Stheraventime_get<_CharT, _InputIterator>::__get_month(int& __m, 2139227825Stheraven iter_type& __b, iter_type __e, 2140227825Stheraven ios_base::iostate& __err, 2141227825Stheraven const ctype<char_type>& __ct) const 2142227825Stheraven{ 2143227825Stheraven int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2) - 1; 2144227825Stheraven if (!(__err & ios_base::failbit) && __t <= 11) 2145227825Stheraven __m = __t; 2146227825Stheraven else 2147227825Stheraven __err |= ios_base::failbit; 2148227825Stheraven} 2149227825Stheraven 2150227825Stheraventemplate <class _CharT, class _InputIterator> 2151227825Stheravenvoid 2152227825Stheraventime_get<_CharT, _InputIterator>::__get_year(int& __y, 2153227825Stheraven iter_type& __b, iter_type __e, 2154227825Stheraven ios_base::iostate& __err, 2155227825Stheraven const ctype<char_type>& __ct) const 2156227825Stheraven{ 2157227825Stheraven int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 4); 2158227825Stheraven if (!(__err & ios_base::failbit)) 2159227825Stheraven { 2160227825Stheraven if (__t < 69) 2161227825Stheraven __t += 2000; 2162227825Stheraven else if (69 <= __t && __t <= 99) 2163227825Stheraven __t += 1900; 2164227825Stheraven __y = __t - 1900; 2165227825Stheraven } 2166227825Stheraven} 2167227825Stheraven 2168227825Stheraventemplate <class _CharT, class _InputIterator> 2169227825Stheravenvoid 2170227825Stheraventime_get<_CharT, _InputIterator>::__get_year4(int& __y, 2171227825Stheraven iter_type& __b, iter_type __e, 2172227825Stheraven ios_base::iostate& __err, 2173227825Stheraven const ctype<char_type>& __ct) const 2174227825Stheraven{ 2175227825Stheraven int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 4); 2176227825Stheraven if (!(__err & ios_base::failbit)) 2177227825Stheraven __y = __t - 1900; 2178227825Stheraven} 2179227825Stheraven 2180227825Stheraventemplate <class _CharT, class _InputIterator> 2181227825Stheravenvoid 2182227825Stheraventime_get<_CharT, _InputIterator>::__get_hour(int& __h, 2183227825Stheraven iter_type& __b, iter_type __e, 2184227825Stheraven ios_base::iostate& __err, 2185227825Stheraven const ctype<char_type>& __ct) const 2186227825Stheraven{ 2187227825Stheraven int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2); 2188227825Stheraven if (!(__err & ios_base::failbit) && __t <= 23) 2189227825Stheraven __h = __t; 2190227825Stheraven else 2191227825Stheraven __err |= ios_base::failbit; 2192227825Stheraven} 2193227825Stheraven 2194227825Stheraventemplate <class _CharT, class _InputIterator> 2195227825Stheravenvoid 2196227825Stheraventime_get<_CharT, _InputIterator>::__get_12_hour(int& __h, 2197227825Stheraven iter_type& __b, iter_type __e, 2198227825Stheraven ios_base::iostate& __err, 2199227825Stheraven const ctype<char_type>& __ct) const 2200227825Stheraven{ 2201227825Stheraven int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2); 2202227825Stheraven if (!(__err & ios_base::failbit) && 1 <= __t && __t <= 12) 2203227825Stheraven __h = __t; 2204227825Stheraven else 2205227825Stheraven __err |= ios_base::failbit; 2206227825Stheraven} 2207227825Stheraven 2208227825Stheraventemplate <class _CharT, class _InputIterator> 2209227825Stheravenvoid 2210227825Stheraventime_get<_CharT, _InputIterator>::__get_minute(int& __m, 2211227825Stheraven iter_type& __b, iter_type __e, 2212227825Stheraven ios_base::iostate& __err, 2213227825Stheraven const ctype<char_type>& __ct) const 2214227825Stheraven{ 2215227825Stheraven int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2); 2216227825Stheraven if (!(__err & ios_base::failbit) && __t <= 59) 2217227825Stheraven __m = __t; 2218227825Stheraven else 2219227825Stheraven __err |= ios_base::failbit; 2220227825Stheraven} 2221227825Stheraven 2222227825Stheraventemplate <class _CharT, class _InputIterator> 2223227825Stheravenvoid 2224227825Stheraventime_get<_CharT, _InputIterator>::__get_second(int& __s, 2225227825Stheraven iter_type& __b, iter_type __e, 2226227825Stheraven ios_base::iostate& __err, 2227227825Stheraven const ctype<char_type>& __ct) const 2228227825Stheraven{ 2229227825Stheraven int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2); 2230227825Stheraven if (!(__err & ios_base::failbit) && __t <= 60) 2231227825Stheraven __s = __t; 2232227825Stheraven else 2233227825Stheraven __err |= ios_base::failbit; 2234227825Stheraven} 2235227825Stheraven 2236227825Stheraventemplate <class _CharT, class _InputIterator> 2237227825Stheravenvoid 2238227825Stheraventime_get<_CharT, _InputIterator>::__get_weekday(int& __w, 2239227825Stheraven iter_type& __b, iter_type __e, 2240227825Stheraven ios_base::iostate& __err, 2241227825Stheraven const ctype<char_type>& __ct) const 2242227825Stheraven{ 2243227825Stheraven int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 1); 2244227825Stheraven if (!(__err & ios_base::failbit) && __t <= 6) 2245227825Stheraven __w = __t; 2246227825Stheraven else 2247227825Stheraven __err |= ios_base::failbit; 2248227825Stheraven} 2249227825Stheraven 2250227825Stheraventemplate <class _CharT, class _InputIterator> 2251227825Stheravenvoid 2252227825Stheraventime_get<_CharT, _InputIterator>::__get_day_year_num(int& __d, 2253227825Stheraven iter_type& __b, iter_type __e, 2254227825Stheraven ios_base::iostate& __err, 2255227825Stheraven const ctype<char_type>& __ct) const 2256227825Stheraven{ 2257227825Stheraven int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 3); 2258227825Stheraven if (!(__err & ios_base::failbit) && __t <= 365) 2259227825Stheraven __d = __t; 2260227825Stheraven else 2261227825Stheraven __err |= ios_base::failbit; 2262227825Stheraven} 2263227825Stheraven 2264227825Stheraventemplate <class _CharT, class _InputIterator> 2265227825Stheravenvoid 2266227825Stheraventime_get<_CharT, _InputIterator>::__get_white_space(iter_type& __b, iter_type __e, 2267227825Stheraven ios_base::iostate& __err, 2268227825Stheraven const ctype<char_type>& __ct) const 2269227825Stheraven{ 2270227825Stheraven for (; __b != __e && __ct.is(ctype_base::space, *__b); ++__b) 2271227825Stheraven ; 2272227825Stheraven if (__b == __e) 2273227825Stheraven __err |= ios_base::eofbit; 2274227825Stheraven} 2275227825Stheraven 2276227825Stheraventemplate <class _CharT, class _InputIterator> 2277227825Stheravenvoid 2278227825Stheraventime_get<_CharT, _InputIterator>::__get_am_pm(int& __h, 2279227825Stheraven iter_type& __b, iter_type __e, 2280227825Stheraven ios_base::iostate& __err, 2281227825Stheraven const ctype<char_type>& __ct) const 2282227825Stheraven{ 2283227825Stheraven const string_type* __ap = this->__am_pm(); 2284227825Stheraven if (__ap[0].size() + __ap[1].size() == 0) 2285227825Stheraven { 2286227825Stheraven __err |= ios_base::failbit; 2287227825Stheraven return; 2288227825Stheraven } 2289227825Stheraven int __i = __scan_keyword(__b, __e, __ap, __ap+2, __ct, __err, false) - __ap; 2290227825Stheraven if (__i == 0 && __h == 12) 2291227825Stheraven __h = 0; 2292227825Stheraven else if (__i == 1 && __h < 12) 2293227825Stheraven __h += 12; 2294227825Stheraven} 2295227825Stheraven 2296227825Stheraventemplate <class _CharT, class _InputIterator> 2297227825Stheravenvoid 2298227825Stheraventime_get<_CharT, _InputIterator>::__get_percent(iter_type& __b, iter_type __e, 2299227825Stheraven ios_base::iostate& __err, 2300227825Stheraven const ctype<char_type>& __ct) const 2301227825Stheraven{ 2302227825Stheraven if (__b == __e) 2303227825Stheraven { 2304227825Stheraven __err |= ios_base::eofbit | ios_base::failbit; 2305227825Stheraven return; 2306227825Stheraven } 2307227825Stheraven if (__ct.narrow(*__b, 0) != '%') 2308227825Stheraven __err |= ios_base::failbit; 2309227825Stheraven else if(++__b == __e) 2310227825Stheraven __err |= ios_base::eofbit; 2311227825Stheraven} 2312227825Stheraven 2313227825Stheraven// time_get end primatives 2314227825Stheraven 2315227825Stheraventemplate <class _CharT, class _InputIterator> 2316227825Stheraven_InputIterator 2317227825Stheraventime_get<_CharT, _InputIterator>::get(iter_type __b, iter_type __e, 2318227825Stheraven ios_base& __iob, 2319227825Stheraven ios_base::iostate& __err, tm* __tm, 2320227825Stheraven const char_type* __fmtb, const char_type* __fmte) const 2321227825Stheraven{ 2322227825Stheraven const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); 2323227825Stheraven __err = ios_base::goodbit; 2324227825Stheraven while (__fmtb != __fmte && __err == ios_base::goodbit) 2325227825Stheraven { 2326227825Stheraven if (__b == __e) 2327227825Stheraven { 2328227825Stheraven __err = ios_base::failbit; 2329227825Stheraven break; 2330227825Stheraven } 2331227825Stheraven if (__ct.narrow(*__fmtb, 0) == '%') 2332227825Stheraven { 2333227825Stheraven if (++__fmtb == __fmte) 2334227825Stheraven { 2335227825Stheraven __err = ios_base::failbit; 2336227825Stheraven break; 2337227825Stheraven } 2338227825Stheraven char __cmd = __ct.narrow(*__fmtb, 0); 2339227825Stheraven char __opt = '\0'; 2340227825Stheraven if (__cmd == 'E' || __cmd == '0') 2341227825Stheraven { 2342227825Stheraven if (++__fmtb == __fmte) 2343227825Stheraven { 2344227825Stheraven __err = ios_base::failbit; 2345227825Stheraven break; 2346227825Stheraven } 2347227825Stheraven __opt = __cmd; 2348227825Stheraven __cmd = __ct.narrow(*__fmtb, 0); 2349227825Stheraven } 2350227825Stheraven __b = do_get(__b, __e, __iob, __err, __tm, __cmd, __opt); 2351227825Stheraven ++__fmtb; 2352227825Stheraven } 2353227825Stheraven else if (__ct.is(ctype_base::space, *__fmtb)) 2354227825Stheraven { 2355227825Stheraven for (++__fmtb; __fmtb != __fmte && __ct.is(ctype_base::space, *__fmtb); ++__fmtb) 2356227825Stheraven ; 2357227825Stheraven for ( ; __b != __e && __ct.is(ctype_base::space, *__b); ++__b) 2358227825Stheraven ; 2359227825Stheraven } 2360227825Stheraven else if (__ct.toupper(*__b) == __ct.toupper(*__fmtb)) 2361227825Stheraven { 2362227825Stheraven ++__b; 2363227825Stheraven ++__fmtb; 2364227825Stheraven } 2365227825Stheraven else 2366227825Stheraven __err = ios_base::failbit; 2367227825Stheraven } 2368227825Stheraven if (__b == __e) 2369227825Stheraven __err |= ios_base::eofbit; 2370227825Stheraven return __b; 2371227825Stheraven} 2372227825Stheraven 2373227825Stheraventemplate <class _CharT, class _InputIterator> 2374227825Stheraventypename time_get<_CharT, _InputIterator>::dateorder 2375227825Stheraventime_get<_CharT, _InputIterator>::do_date_order() const 2376227825Stheraven{ 2377227825Stheraven return mdy; 2378227825Stheraven} 2379227825Stheraven 2380227825Stheraventemplate <class _CharT, class _InputIterator> 2381227825Stheraven_InputIterator 2382227825Stheraventime_get<_CharT, _InputIterator>::do_get_time(iter_type __b, iter_type __e, 2383227825Stheraven ios_base& __iob, 2384227825Stheraven ios_base::iostate& __err, 2385227825Stheraven tm* __tm) const 2386227825Stheraven{ 2387227825Stheraven const char_type __fmt[] = {'%', 'H', ':', '%', 'M', ':', '%', 'S'}; 2388227825Stheraven return get(__b, __e, __iob, __err, __tm, __fmt, __fmt + sizeof(__fmt)/sizeof(__fmt[0])); 2389227825Stheraven} 2390227825Stheraven 2391227825Stheraventemplate <class _CharT, class _InputIterator> 2392227825Stheraven_InputIterator 2393227825Stheraventime_get<_CharT, _InputIterator>::do_get_date(iter_type __b, iter_type __e, 2394227825Stheraven ios_base& __iob, 2395227825Stheraven ios_base::iostate& __err, 2396227825Stheraven tm* __tm) const 2397227825Stheraven{ 2398227825Stheraven const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); 2399227825Stheraven const string_type& __fmt = this->__x(); 2400227825Stheraven return get(__b, __e, __iob, __err, __tm, __fmt.data(), __fmt.data() + __fmt.size()); 2401227825Stheraven} 2402227825Stheraven 2403227825Stheraventemplate <class _CharT, class _InputIterator> 2404227825Stheraven_InputIterator 2405227825Stheraventime_get<_CharT, _InputIterator>::do_get_weekday(iter_type __b, iter_type __e, 2406227825Stheraven ios_base& __iob, 2407227825Stheraven ios_base::iostate& __err, 2408227825Stheraven tm* __tm) const 2409227825Stheraven{ 2410227825Stheraven const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); 2411227825Stheraven __get_weekdayname(__tm->tm_wday, __b, __e, __err, __ct); 2412227825Stheraven return __b; 2413227825Stheraven} 2414227825Stheraven 2415227825Stheraventemplate <class _CharT, class _InputIterator> 2416227825Stheraven_InputIterator 2417227825Stheraventime_get<_CharT, _InputIterator>::do_get_monthname(iter_type __b, iter_type __e, 2418227825Stheraven ios_base& __iob, 2419227825Stheraven ios_base::iostate& __err, 2420227825Stheraven tm* __tm) const 2421227825Stheraven{ 2422227825Stheraven const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); 2423227825Stheraven __get_monthname(__tm->tm_mon, __b, __e, __err, __ct); 2424227825Stheraven return __b; 2425227825Stheraven} 2426227825Stheraven 2427227825Stheraventemplate <class _CharT, class _InputIterator> 2428227825Stheraven_InputIterator 2429227825Stheraventime_get<_CharT, _InputIterator>::do_get_year(iter_type __b, iter_type __e, 2430227825Stheraven ios_base& __iob, 2431227825Stheraven ios_base::iostate& __err, 2432227825Stheraven tm* __tm) const 2433227825Stheraven{ 2434227825Stheraven const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); 2435227825Stheraven __get_year(__tm->tm_year, __b, __e, __err, __ct); 2436227825Stheraven return __b; 2437227825Stheraven} 2438227825Stheraven 2439227825Stheraventemplate <class _CharT, class _InputIterator> 2440227825Stheraven_InputIterator 2441227825Stheraventime_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 2442227825Stheraven ios_base& __iob, 2443227825Stheraven ios_base::iostate& __err, tm* __tm, 2444227825Stheraven char __fmt, char) const 2445227825Stheraven{ 2446227825Stheraven __err = ios_base::goodbit; 2447227825Stheraven const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); 2448227825Stheraven switch (__fmt) 2449227825Stheraven { 2450227825Stheraven case 'a': 2451227825Stheraven case 'A': 2452227825Stheraven __get_weekdayname(__tm->tm_wday, __b, __e, __err, __ct); 2453227825Stheraven break; 2454227825Stheraven case 'b': 2455227825Stheraven case 'B': 2456227825Stheraven case 'h': 2457227825Stheraven __get_monthname(__tm->tm_mon, __b, __e, __err, __ct); 2458227825Stheraven break; 2459227825Stheraven case 'c': 2460227825Stheraven { 2461227825Stheraven const string_type& __fmt = this->__c(); 2462227825Stheraven __b = get(__b, __e, __iob, __err, __tm, __fmt.data(), __fmt.data() + __fmt.size()); 2463227825Stheraven } 2464227825Stheraven break; 2465227825Stheraven case 'd': 2466227825Stheraven case 'e': 2467227825Stheraven __get_day(__tm->tm_mday, __b, __e, __err, __ct); 2468227825Stheraven break; 2469227825Stheraven case 'D': 2470227825Stheraven { 2471227825Stheraven const char_type __fmt[] = {'%', 'm', '/', '%', 'd', '/', '%', 'y'}; 2472227825Stheraven __b = get(__b, __e, __iob, __err, __tm, __fmt, __fmt + sizeof(__fmt)/sizeof(__fmt[0])); 2473227825Stheraven } 2474227825Stheraven break; 2475227825Stheraven case 'F': 2476227825Stheraven { 2477227825Stheraven const char_type __fmt[] = {'%', 'Y', '-', '%', 'm', '-', '%', 'd'}; 2478227825Stheraven __b = get(__b, __e, __iob, __err, __tm, __fmt, __fmt + sizeof(__fmt)/sizeof(__fmt[0])); 2479227825Stheraven } 2480227825Stheraven break; 2481227825Stheraven case 'H': 2482227825Stheraven __get_hour(__tm->tm_hour, __b, __e, __err, __ct); 2483227825Stheraven break; 2484227825Stheraven case 'I': 2485227825Stheraven __get_12_hour(__tm->tm_hour, __b, __e, __err, __ct); 2486227825Stheraven break; 2487227825Stheraven case 'j': 2488227825Stheraven __get_day_year_num(__tm->tm_yday, __b, __e, __err, __ct); 2489227825Stheraven break; 2490227825Stheraven case 'm': 2491227825Stheraven __get_month(__tm->tm_mon, __b, __e, __err, __ct); 2492227825Stheraven break; 2493227825Stheraven case 'M': 2494227825Stheraven __get_minute(__tm->tm_min, __b, __e, __err, __ct); 2495227825Stheraven break; 2496227825Stheraven case 'n': 2497227825Stheraven case 't': 2498227825Stheraven __get_white_space(__b, __e, __err, __ct); 2499227825Stheraven break; 2500227825Stheraven case 'p': 2501227825Stheraven __get_am_pm(__tm->tm_hour, __b, __e, __err, __ct); 2502227825Stheraven break; 2503227825Stheraven case 'r': 2504227825Stheraven { 2505227825Stheraven const char_type __fmt[] = {'%', 'I', ':', '%', 'M', ':', '%', 'S', ' ', '%', 'p'}; 2506227825Stheraven __b = get(__b, __e, __iob, __err, __tm, __fmt, __fmt + sizeof(__fmt)/sizeof(__fmt[0])); 2507227825Stheraven } 2508227825Stheraven break; 2509227825Stheraven case 'R': 2510227825Stheraven { 2511227825Stheraven const char_type __fmt[] = {'%', 'H', ':', '%', 'M'}; 2512227825Stheraven __b = get(__b, __e, __iob, __err, __tm, __fmt, __fmt + sizeof(__fmt)/sizeof(__fmt[0])); 2513227825Stheraven } 2514227825Stheraven break; 2515227825Stheraven case 'S': 2516227825Stheraven __get_second(__tm->tm_sec, __b, __e, __err, __ct); 2517227825Stheraven break; 2518227825Stheraven case 'T': 2519227825Stheraven { 2520227825Stheraven const char_type __fmt[] = {'%', 'H', ':', '%', 'M', ':', '%', 'S'}; 2521227825Stheraven __b = get(__b, __e, __iob, __err, __tm, __fmt, __fmt + sizeof(__fmt)/sizeof(__fmt[0])); 2522227825Stheraven } 2523227825Stheraven break; 2524227825Stheraven case 'w': 2525227825Stheraven __get_weekday(__tm->tm_wday, __b, __e, __err, __ct); 2526227825Stheraven break; 2527227825Stheraven case 'x': 2528227825Stheraven return do_get_date(__b, __e, __iob, __err, __tm); 2529227825Stheraven case 'X': 2530227825Stheraven { 2531227825Stheraven const string_type& __fmt = this->__X(); 2532227825Stheraven __b = get(__b, __e, __iob, __err, __tm, __fmt.data(), __fmt.data() + __fmt.size()); 2533227825Stheraven } 2534227825Stheraven break; 2535227825Stheraven case 'y': 2536227825Stheraven __get_year(__tm->tm_year, __b, __e, __err, __ct); 2537227825Stheraven break; 2538227825Stheraven case 'Y': 2539227825Stheraven __get_year4(__tm->tm_year, __b, __e, __err, __ct); 2540227825Stheraven break; 2541227825Stheraven case '%': 2542227825Stheraven __get_percent(__b, __e, __err, __ct); 2543227825Stheraven break; 2544227825Stheraven default: 2545227825Stheraven __err |= ios_base::failbit; 2546227825Stheraven } 2547227825Stheraven return __b; 2548227825Stheraven} 2549227825Stheraven 2550227825Stheravenextern template class time_get<char>; 2551227825Stheravenextern template class time_get<wchar_t>; 2552227825Stheraven 2553227825Stheravenclass __time_get 2554227825Stheraven{ 2555227825Stheravenprotected: 2556227825Stheraven locale_t __loc_; 2557227825Stheraven 2558227825Stheraven __time_get(const char* __nm); 2559227825Stheraven __time_get(const string& __nm); 2560227825Stheraven ~__time_get(); 2561227825Stheraven}; 2562227825Stheraven 2563227825Stheraventemplate <class _CharT> 2564227825Stheravenclass __time_get_storage 2565227825Stheraven : public __time_get 2566227825Stheraven{ 2567227825Stheravenprotected: 2568227825Stheraven typedef basic_string<_CharT> string_type; 2569227825Stheraven 2570227825Stheraven string_type __weeks_[14]; 2571227825Stheraven string_type __months_[24]; 2572227825Stheraven string_type __am_pm_[2]; 2573227825Stheraven string_type __c_; 2574227825Stheraven string_type __r_; 2575227825Stheraven string_type __x_; 2576227825Stheraven string_type __X_; 2577227825Stheraven 2578227825Stheraven explicit __time_get_storage(const char* __nm); 2579227825Stheraven explicit __time_get_storage(const string& __nm); 2580227825Stheraven 2581227825Stheraven _LIBCPP_ALWAYS_INLINE ~__time_get_storage() {} 2582227825Stheraven 2583227825Stheraven time_base::dateorder __do_date_order() const; 2584227825Stheraven 2585227825Stheravenprivate: 2586227825Stheraven void init(const ctype<_CharT>&); 2587227825Stheraven string_type __analyze(char __fmt, const ctype<_CharT>&); 2588227825Stheraven}; 2589227825Stheraven 2590227825Stheraventemplate <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> > 2591227825Stheravenclass _LIBCPP_VISIBLE time_get_byname 2592227825Stheraven : public time_get<_CharT, _InputIterator>, 2593227825Stheraven private __time_get_storage<_CharT> 2594227825Stheraven{ 2595227825Stheravenpublic: 2596227825Stheraven typedef time_base::dateorder dateorder; 2597227825Stheraven typedef _InputIterator iter_type; 2598227825Stheraven typedef _CharT char_type; 2599227825Stheraven typedef basic_string<char_type> string_type; 2600227825Stheraven 2601227825Stheraven _LIBCPP_INLINE_VISIBILITY 2602227825Stheraven explicit time_get_byname(const char* __nm, size_t __refs = 0) 2603227825Stheraven : time_get<_CharT, _InputIterator>(__refs), 2604227825Stheraven __time_get_storage<_CharT>(__nm) {} 2605227825Stheraven _LIBCPP_INLINE_VISIBILITY 2606227825Stheraven explicit time_get_byname(const string& __nm, size_t __refs = 0) 2607227825Stheraven : time_get<_CharT, _InputIterator>(__refs), 2608227825Stheraven __time_get_storage<_CharT>(__nm) {} 2609227825Stheraven 2610227825Stheravenprotected: 2611227825Stheraven _LIBCPP_INLINE_VISIBILITY 2612227825Stheraven ~time_get_byname() {} 2613227825Stheraven 2614227825Stheraven _LIBCPP_INLINE_VISIBILITY 2615227825Stheraven virtual dateorder do_date_order() const {return this->__do_date_order();} 2616227825Stheravenprivate: 2617227825Stheraven _LIBCPP_INLINE_VISIBILITY 2618227825Stheraven virtual const string_type* __weeks() const {return this->__weeks_;} 2619227825Stheraven _LIBCPP_INLINE_VISIBILITY 2620227825Stheraven virtual const string_type* __months() const {return this->__months_;} 2621227825Stheraven _LIBCPP_INLINE_VISIBILITY 2622227825Stheraven virtual const string_type* __am_pm() const {return this->__am_pm_;} 2623227825Stheraven _LIBCPP_INLINE_VISIBILITY 2624227825Stheraven virtual const string_type& __c() const {return this->__c_;} 2625227825Stheraven _LIBCPP_INLINE_VISIBILITY 2626227825Stheraven virtual const string_type& __r() const {return this->__r_;} 2627227825Stheraven _LIBCPP_INLINE_VISIBILITY 2628227825Stheraven virtual const string_type& __x() const {return this->__x_;} 2629227825Stheraven _LIBCPP_INLINE_VISIBILITY 2630227825Stheraven virtual const string_type& __X() const {return this->__X_;} 2631227825Stheraven}; 2632227825Stheraven 2633227825Stheravenextern template class time_get_byname<char>; 2634227825Stheravenextern template class time_get_byname<wchar_t>; 2635227825Stheraven 2636227825Stheravenclass __time_put 2637227825Stheraven{ 2638227825Stheraven locale_t __loc_; 2639227825Stheravenprotected: 2640227825Stheraven _LIBCPP_ALWAYS_INLINE __time_put() : __loc_(_LIBCPP_GET_C_LOCALE) {} 2641227825Stheraven __time_put(const char* __nm); 2642227825Stheraven __time_put(const string& __nm); 2643227825Stheraven ~__time_put(); 2644227825Stheraven void __do_put(char* __nb, char*& __ne, const tm* __tm, 2645227825Stheraven char __fmt, char __mod) const; 2646227825Stheraven void __do_put(wchar_t* __wb, wchar_t*& __we, const tm* __tm, 2647227825Stheraven char __fmt, char __mod) const; 2648227825Stheraven}; 2649227825Stheraven 2650227825Stheraventemplate <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> > 2651227825Stheravenclass _LIBCPP_VISIBLE time_put 2652227825Stheraven : public locale::facet, 2653227825Stheraven private __time_put 2654227825Stheraven{ 2655227825Stheravenpublic: 2656227825Stheraven typedef _CharT char_type; 2657227825Stheraven typedef _OutputIterator iter_type; 2658227825Stheraven 2659227825Stheraven _LIBCPP_ALWAYS_INLINE 2660227825Stheraven explicit time_put(size_t __refs = 0) 2661227825Stheraven : locale::facet(__refs) {} 2662227825Stheraven 2663227825Stheraven iter_type put(iter_type __s, ios_base& __iob, char_type __fl, const tm* __tm, 2664227825Stheraven const char_type* __pb, const char_type* __pe) const; 2665227825Stheraven 2666227825Stheraven _LIBCPP_ALWAYS_INLINE 2667227825Stheraven iter_type put(iter_type __s, ios_base& __iob, char_type __fl, 2668227825Stheraven const tm* __tm, char __fmt, char __mod = 0) const 2669227825Stheraven { 2670227825Stheraven return do_put(__s, __iob, __fl, __tm, __fmt, __mod); 2671227825Stheraven } 2672227825Stheraven 2673227825Stheraven static locale::id id; 2674227825Stheraven 2675227825Stheravenprotected: 2676227825Stheraven _LIBCPP_ALWAYS_INLINE 2677227825Stheraven ~time_put() {} 2678227825Stheraven virtual iter_type do_put(iter_type __s, ios_base&, char_type, const tm* __tm, 2679227825Stheraven char __fmt, char __mod) const; 2680227825Stheraven 2681227825Stheraven _LIBCPP_ALWAYS_INLINE 2682227825Stheraven explicit time_put(const char* __nm, size_t __refs) 2683227825Stheraven : locale::facet(__refs), 2684227825Stheraven __time_put(__nm) {} 2685227825Stheraven _LIBCPP_ALWAYS_INLINE 2686227825Stheraven explicit time_put(const string& __nm, size_t __refs) 2687227825Stheraven : locale::facet(__refs), 2688227825Stheraven __time_put(__nm) {} 2689227825Stheraven}; 2690227825Stheraven 2691227825Stheraventemplate <class _CharT, class _OutputIterator> 2692227825Stheravenlocale::id 2693227825Stheraventime_put<_CharT, _OutputIterator>::id; 2694227825Stheraven 2695227825Stheraventemplate <class _CharT, class _OutputIterator> 2696227825Stheraven_OutputIterator 2697227825Stheraventime_put<_CharT, _OutputIterator>::put(iter_type __s, ios_base& __iob, 2698227825Stheraven char_type __fl, const tm* __tm, 2699227825Stheraven const char_type* __pb, 2700227825Stheraven const char_type* __pe) const 2701227825Stheraven{ 2702227825Stheraven const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); 2703227825Stheraven for (; __pb != __pe; ++__pb) 2704227825Stheraven { 2705227825Stheraven if (__ct.narrow(*__pb, 0) == '%') 2706227825Stheraven { 2707227825Stheraven if (++__pb == __pe) 2708227825Stheraven { 2709227825Stheraven *__s++ = __pb[-1]; 2710227825Stheraven break; 2711227825Stheraven } 2712227825Stheraven char __mod = 0; 2713227825Stheraven char __fmt = __ct.narrow(*__pb, 0); 2714227825Stheraven if (__fmt == 'E' || __fmt == 'O') 2715227825Stheraven { 2716227825Stheraven if (++__pb == __pe) 2717227825Stheraven { 2718227825Stheraven *__s++ = __pb[-2]; 2719227825Stheraven *__s++ = __pb[-1]; 2720227825Stheraven break; 2721227825Stheraven } 2722227825Stheraven __mod = __fmt; 2723227825Stheraven __fmt = __ct.narrow(*__pb, 0); 2724227825Stheraven } 2725227825Stheraven __s = do_put(__s, __iob, __fl, __tm, __fmt, __mod); 2726227825Stheraven } 2727227825Stheraven else 2728227825Stheraven *__s++ = *__pb; 2729227825Stheraven } 2730227825Stheraven return __s; 2731227825Stheraven} 2732227825Stheraven 2733227825Stheraventemplate <class _CharT, class _OutputIterator> 2734227825Stheraven_OutputIterator 2735227825Stheraventime_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, 2736227825Stheraven char_type, const tm* __tm, 2737227825Stheraven char __fmt, char __mod) const 2738227825Stheraven{ 2739227825Stheraven char_type __nar[100]; 2740227825Stheraven char_type* __nb = __nar; 2741227825Stheraven char_type* __ne = __nb + 100; 2742227825Stheraven __do_put(__nb, __ne, __tm, __fmt, __mod); 2743227825Stheraven return _VSTD::copy(__nb, __ne, __s); 2744227825Stheraven} 2745227825Stheraven 2746227825Stheravenextern template class time_put<char>; 2747227825Stheravenextern template class time_put<wchar_t>; 2748227825Stheraven 2749227825Stheraventemplate <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> > 2750227825Stheravenclass _LIBCPP_VISIBLE time_put_byname 2751227825Stheraven : public time_put<_CharT, _OutputIterator> 2752227825Stheraven{ 2753227825Stheravenpublic: 2754227825Stheraven _LIBCPP_ALWAYS_INLINE 2755227825Stheraven explicit time_put_byname(const char* __nm, size_t __refs = 0) 2756227825Stheraven : time_put<_CharT, _OutputIterator>(__nm, __refs) {} 2757227825Stheraven 2758227825Stheraven _LIBCPP_ALWAYS_INLINE 2759227825Stheraven explicit time_put_byname(const string& __nm, size_t __refs = 0) 2760227825Stheraven : time_put<_CharT, _OutputIterator>(__nm, __refs) {} 2761227825Stheraven 2762227825Stheravenprotected: 2763227825Stheraven _LIBCPP_ALWAYS_INLINE 2764227825Stheraven ~time_put_byname() {} 2765227825Stheraven}; 2766227825Stheraven 2767227825Stheravenextern template class time_put_byname<char>; 2768227825Stheravenextern template class time_put_byname<wchar_t>; 2769227825Stheraven 2770227825Stheraven// money_base 2771227825Stheraven 2772227825Stheravenclass _LIBCPP_VISIBLE money_base 2773227825Stheraven{ 2774227825Stheravenpublic: 2775227825Stheraven enum part {none, space, symbol, sign, value}; 2776227825Stheraven struct pattern {char field[4];}; 2777227825Stheraven 2778227825Stheraven _LIBCPP_ALWAYS_INLINE money_base() {} 2779227825Stheraven}; 2780227825Stheraven 2781227825Stheraven// moneypunct 2782227825Stheraven 2783227825Stheraventemplate <class _CharT, bool _International = false> 2784227825Stheravenclass _LIBCPP_VISIBLE moneypunct 2785227825Stheraven : public locale::facet, 2786227825Stheraven public money_base 2787227825Stheraven{ 2788227825Stheravenpublic: 2789227825Stheraven typedef _CharT char_type; 2790227825Stheraven typedef basic_string<char_type> string_type; 2791227825Stheraven 2792227825Stheraven _LIBCPP_ALWAYS_INLINE 2793227825Stheraven explicit moneypunct(size_t __refs = 0) 2794227825Stheraven : locale::facet(__refs) {} 2795227825Stheraven 2796227825Stheraven _LIBCPP_ALWAYS_INLINE char_type decimal_point() const {return do_decimal_point();} 2797227825Stheraven _LIBCPP_ALWAYS_INLINE char_type thousands_sep() const {return do_thousands_sep();} 2798227825Stheraven _LIBCPP_ALWAYS_INLINE string grouping() const {return do_grouping();} 2799227825Stheraven _LIBCPP_ALWAYS_INLINE string_type curr_symbol() const {return do_curr_symbol();} 2800227825Stheraven _LIBCPP_ALWAYS_INLINE string_type positive_sign() const {return do_positive_sign();} 2801227825Stheraven _LIBCPP_ALWAYS_INLINE string_type negative_sign() const {return do_negative_sign();} 2802227825Stheraven _LIBCPP_ALWAYS_INLINE int frac_digits() const {return do_frac_digits();} 2803227825Stheraven _LIBCPP_ALWAYS_INLINE pattern pos_format() const {return do_pos_format();} 2804227825Stheraven _LIBCPP_ALWAYS_INLINE pattern neg_format() const {return do_neg_format();} 2805227825Stheraven 2806227825Stheraven static locale::id id; 2807227825Stheraven static const bool intl = _International; 2808227825Stheraven 2809227825Stheravenprotected: 2810227825Stheraven _LIBCPP_ALWAYS_INLINE 2811227825Stheraven ~moneypunct() {} 2812227825Stheraven 2813227825Stheraven virtual char_type do_decimal_point() const {return numeric_limits<char_type>::max();} 2814227825Stheraven virtual char_type do_thousands_sep() const {return numeric_limits<char_type>::max();} 2815227825Stheraven virtual string do_grouping() const {return string();} 2816227825Stheraven virtual string_type do_curr_symbol() const {return string_type();} 2817227825Stheraven virtual string_type do_positive_sign() const {return string_type();} 2818227825Stheraven virtual string_type do_negative_sign() const {return string_type(1, '-');} 2819227825Stheraven virtual int do_frac_digits() const {return 0;} 2820227825Stheraven virtual pattern do_pos_format() const 2821227825Stheraven {pattern __p = {symbol, sign, none, value}; return __p;} 2822227825Stheraven virtual pattern do_neg_format() const 2823227825Stheraven {pattern __p = {symbol, sign, none, value}; return __p;} 2824227825Stheraven}; 2825227825Stheraven 2826227825Stheraventemplate <class _CharT, bool _International> 2827227825Stheravenlocale::id 2828227825Stheravenmoneypunct<_CharT, _International>::id; 2829227825Stheraven 2830227825Stheravenextern template class moneypunct<char, false>; 2831227825Stheravenextern template class moneypunct<char, true>; 2832227825Stheravenextern template class moneypunct<wchar_t, false>; 2833227825Stheravenextern template class moneypunct<wchar_t, true>; 2834227825Stheraven 2835227825Stheraven// moneypunct_byname 2836227825Stheraven 2837227825Stheraventemplate <class _CharT, bool _International = false> 2838227825Stheravenclass _LIBCPP_VISIBLE moneypunct_byname 2839227825Stheraven : public moneypunct<_CharT, _International> 2840227825Stheraven{ 2841227825Stheravenpublic: 2842227825Stheraven typedef money_base::pattern pattern; 2843227825Stheraven typedef _CharT char_type; 2844227825Stheraven typedef basic_string<char_type> string_type; 2845227825Stheraven 2846227825Stheraven _LIBCPP_ALWAYS_INLINE 2847227825Stheraven explicit moneypunct_byname(const char* __nm, size_t __refs = 0) 2848227825Stheraven : moneypunct<_CharT, _International>(__refs) {init(__nm);} 2849227825Stheraven 2850227825Stheraven _LIBCPP_ALWAYS_INLINE 2851227825Stheraven explicit moneypunct_byname(const string& __nm, size_t __refs = 0) 2852227825Stheraven : moneypunct<_CharT, _International>(__refs) {init(__nm.c_str());} 2853227825Stheraven 2854227825Stheravenprotected: 2855227825Stheraven _LIBCPP_ALWAYS_INLINE 2856227825Stheraven ~moneypunct_byname() {} 2857227825Stheraven 2858227825Stheraven virtual char_type do_decimal_point() const {return __decimal_point_;} 2859227825Stheraven virtual char_type do_thousands_sep() const {return __thousands_sep_;} 2860227825Stheraven virtual string do_grouping() const {return __grouping_;} 2861227825Stheraven virtual string_type do_curr_symbol() const {return __curr_symbol_;} 2862227825Stheraven virtual string_type do_positive_sign() const {return __positive_sign_;} 2863227825Stheraven virtual string_type do_negative_sign() const {return __negative_sign_;} 2864227825Stheraven virtual int do_frac_digits() const {return __frac_digits_;} 2865227825Stheraven virtual pattern do_pos_format() const {return __pos_format_;} 2866227825Stheraven virtual pattern do_neg_format() const {return __neg_format_;} 2867227825Stheraven 2868227825Stheravenprivate: 2869227825Stheraven char_type __decimal_point_; 2870227825Stheraven char_type __thousands_sep_; 2871227825Stheraven string __grouping_; 2872227825Stheraven string_type __curr_symbol_; 2873227825Stheraven string_type __positive_sign_; 2874227825Stheraven string_type __negative_sign_; 2875227825Stheraven int __frac_digits_; 2876227825Stheraven pattern __pos_format_; 2877227825Stheraven pattern __neg_format_; 2878227825Stheraven 2879227825Stheraven void init(const char*); 2880227825Stheraven}; 2881227825Stheraven 2882227825Stheraventemplate<> void moneypunct_byname<char, false>::init(const char*); 2883227825Stheraventemplate<> void moneypunct_byname<char, true>::init(const char*); 2884227825Stheraventemplate<> void moneypunct_byname<wchar_t, false>::init(const char*); 2885227825Stheraventemplate<> void moneypunct_byname<wchar_t, true>::init(const char*); 2886227825Stheraven 2887227825Stheravenextern template class moneypunct_byname<char, false>; 2888227825Stheravenextern template class moneypunct_byname<char, true>; 2889227825Stheravenextern template class moneypunct_byname<wchar_t, false>; 2890227825Stheravenextern template class moneypunct_byname<wchar_t, true>; 2891227825Stheraven 2892227825Stheraven// money_get 2893227825Stheraven 2894227825Stheraventemplate <class _CharT> 2895227825Stheravenclass __money_get 2896227825Stheraven{ 2897227825Stheravenprotected: 2898227825Stheraven typedef _CharT char_type; 2899227825Stheraven typedef basic_string<char_type> string_type; 2900227825Stheraven 2901227825Stheraven _LIBCPP_ALWAYS_INLINE __money_get() {} 2902227825Stheraven 2903227825Stheraven static void __gather_info(bool __intl, const locale& __loc, 2904227825Stheraven money_base::pattern& __pat, char_type& __dp, 2905227825Stheraven char_type& __ts, string& __grp, 2906227825Stheraven string_type& __sym, string_type& __psn, 2907227825Stheraven string_type& __nsn, int& __fd); 2908227825Stheraven}; 2909227825Stheraven 2910227825Stheraventemplate <class _CharT> 2911227825Stheravenvoid 2912227825Stheraven__money_get<_CharT>::__gather_info(bool __intl, const locale& __loc, 2913227825Stheraven money_base::pattern& __pat, char_type& __dp, 2914227825Stheraven char_type& __ts, string& __grp, 2915227825Stheraven string_type& __sym, string_type& __psn, 2916227825Stheraven string_type& __nsn, int& __fd) 2917227825Stheraven{ 2918227825Stheraven if (__intl) 2919227825Stheraven { 2920227825Stheraven const moneypunct<char_type, true>& __mp = 2921227825Stheraven use_facet<moneypunct<char_type, true> >(__loc); 2922227825Stheraven __pat = __mp.neg_format(); 2923227825Stheraven __nsn = __mp.negative_sign(); 2924227825Stheraven __psn = __mp.positive_sign(); 2925227825Stheraven __dp = __mp.decimal_point(); 2926227825Stheraven __ts = __mp.thousands_sep(); 2927227825Stheraven __grp = __mp.grouping(); 2928227825Stheraven __sym = __mp.curr_symbol(); 2929227825Stheraven __fd = __mp.frac_digits(); 2930227825Stheraven } 2931227825Stheraven else 2932227825Stheraven { 2933227825Stheraven const moneypunct<char_type, false>& __mp = 2934227825Stheraven use_facet<moneypunct<char_type, false> >(__loc); 2935227825Stheraven __pat = __mp.neg_format(); 2936227825Stheraven __nsn = __mp.negative_sign(); 2937227825Stheraven __psn = __mp.positive_sign(); 2938227825Stheraven __dp = __mp.decimal_point(); 2939227825Stheraven __ts = __mp.thousands_sep(); 2940227825Stheraven __grp = __mp.grouping(); 2941227825Stheraven __sym = __mp.curr_symbol(); 2942227825Stheraven __fd = __mp.frac_digits(); 2943227825Stheraven } 2944227825Stheraven} 2945227825Stheraven 2946227825Stheravenextern template class __money_get<char>; 2947227825Stheravenextern template class __money_get<wchar_t>; 2948227825Stheraven 2949227825Stheraventemplate <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> > 2950227825Stheravenclass _LIBCPP_VISIBLE money_get 2951227825Stheraven : public locale::facet, 2952227825Stheraven private __money_get<_CharT> 2953227825Stheraven{ 2954227825Stheravenpublic: 2955227825Stheraven typedef _CharT char_type; 2956227825Stheraven typedef _InputIterator iter_type; 2957227825Stheraven typedef basic_string<char_type> string_type; 2958227825Stheraven 2959227825Stheraven _LIBCPP_ALWAYS_INLINE 2960227825Stheraven explicit money_get(size_t __refs = 0) 2961227825Stheraven : locale::facet(__refs) {} 2962227825Stheraven 2963227825Stheraven _LIBCPP_ALWAYS_INLINE 2964227825Stheraven iter_type get(iter_type __b, iter_type __e, bool __intl, ios_base& __iob, 2965227825Stheraven ios_base::iostate& __err, long double& __v) const 2966227825Stheraven { 2967227825Stheraven return do_get(__b, __e, __intl, __iob, __err, __v); 2968227825Stheraven } 2969227825Stheraven 2970227825Stheraven _LIBCPP_ALWAYS_INLINE 2971227825Stheraven iter_type get(iter_type __b, iter_type __e, bool __intl, ios_base& __iob, 2972227825Stheraven ios_base::iostate& __err, string_type& __v) const 2973227825Stheraven { 2974227825Stheraven return do_get(__b, __e, __intl, __iob, __err, __v); 2975227825Stheraven } 2976227825Stheraven 2977227825Stheraven static locale::id id; 2978227825Stheraven 2979227825Stheravenprotected: 2980227825Stheraven 2981227825Stheraven _LIBCPP_ALWAYS_INLINE 2982227825Stheraven ~money_get() {} 2983227825Stheraven 2984227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, bool __intl, 2985227825Stheraven ios_base& __iob, ios_base::iostate& __err, 2986227825Stheraven long double& __v) const; 2987227825Stheraven virtual iter_type do_get(iter_type __b, iter_type __e, bool __intl, 2988227825Stheraven ios_base& __iob, ios_base::iostate& __err, 2989227825Stheraven string_type& __v) const; 2990227825Stheraven 2991227825Stheravenprivate: 2992227825Stheraven static bool __do_get(iter_type& __b, iter_type __e, 2993227825Stheraven bool __intl, const locale& __loc, 2994227825Stheraven ios_base::fmtflags __flags, ios_base::iostate& __err, 2995227825Stheraven bool& __neg, const ctype<char_type>& __ct, 2996227825Stheraven unique_ptr<char_type, void(*)(void*)>& __wb, 2997227825Stheraven char_type*& __wn, char_type* __we); 2998227825Stheraven}; 2999227825Stheraven 3000227825Stheraventemplate <class _CharT, class _InputIterator> 3001227825Stheravenlocale::id 3002227825Stheravenmoney_get<_CharT, _InputIterator>::id; 3003227825Stheraven 3004227825Stheravenvoid __do_nothing(void*); 3005227825Stheraven 3006227825Stheraventemplate <class _Tp> 3007227825Stheraven_LIBCPP_HIDDEN 3008227825Stheravenvoid 3009227825Stheraven__double_or_nothing(unique_ptr<_Tp, void(*)(void*)>& __b, _Tp*& __n, _Tp*& __e) 3010227825Stheraven{ 3011227825Stheraven bool __owns = __b.get_deleter() != __do_nothing; 3012227825Stheraven size_t __cur_cap = (__e-__b.get()) * sizeof(_Tp); 3013227825Stheraven size_t __new_cap = __cur_cap < numeric_limits<size_t>::max() / 2 ? 3014227825Stheraven 2 * __cur_cap : numeric_limits<size_t>::max(); 3015227825Stheraven size_t __n_off = __n - __b.get(); 3016227825Stheraven _Tp* __t = (_Tp*)realloc(__owns ? __b.get() : 0, __new_cap); 3017227825Stheraven if (__t == 0) 3018227825Stheraven __throw_bad_alloc(); 3019227825Stheraven if (__owns) 3020227825Stheraven __b.release(); 3021227825Stheraven __b = unique_ptr<_Tp, void(*)(void*)>(__t, free); 3022227825Stheraven __new_cap /= sizeof(_Tp); 3023227825Stheraven __n = __b.get() + __n_off; 3024227825Stheraven __e = __b.get() + __new_cap; 3025227825Stheraven} 3026227825Stheraven 3027227825Stheraven// true == success 3028227825Stheraventemplate <class _CharT, class _InputIterator> 3029227825Stheravenbool 3030227825Stheravenmoney_get<_CharT, _InputIterator>::__do_get(iter_type& __b, iter_type __e, 3031227825Stheraven bool __intl, const locale& __loc, 3032227825Stheraven ios_base::fmtflags __flags, 3033227825Stheraven ios_base::iostate& __err, 3034227825Stheraven bool& __neg, 3035227825Stheraven const ctype<char_type>& __ct, 3036227825Stheraven unique_ptr<char_type, void(*)(void*)>& __wb, 3037227825Stheraven char_type*& __wn, char_type* __we) 3038227825Stheraven{ 3039227825Stheraven const unsigned __bz = 100; 3040227825Stheraven unsigned __gbuf[__bz]; 3041227825Stheraven unique_ptr<unsigned, void(*)(void*)> __gb(__gbuf, __do_nothing); 3042227825Stheraven unsigned* __gn = __gb.get(); 3043227825Stheraven unsigned* __ge = __gn + __bz; 3044227825Stheraven money_base::pattern __pat; 3045227825Stheraven char_type __dp; 3046227825Stheraven char_type __ts; 3047227825Stheraven string __grp; 3048227825Stheraven string_type __sym; 3049227825Stheraven string_type __psn; 3050227825Stheraven string_type __nsn; 3051227825Stheraven int __fd; 3052227825Stheraven __money_get<_CharT>::__gather_info(__intl, __loc, __pat, __dp, __ts, __grp, 3053227825Stheraven __sym, __psn, __nsn, __fd); 3054227825Stheraven const string_type* __trailing_sign = 0; 3055227825Stheraven __wn = __wb.get(); 3056227825Stheraven for (unsigned __p = 0; __p < 4 && __b != __e; ++__p) 3057227825Stheraven { 3058227825Stheraven switch (__pat.field[__p]) 3059227825Stheraven { 3060227825Stheraven case money_base::space: 3061227825Stheraven if (__p != 3) 3062227825Stheraven { 3063227825Stheraven if (__ct.is(ctype_base::space, *__b)) 3064227825Stheraven ++__b; 3065227825Stheraven else 3066227825Stheraven { 3067227825Stheraven __err |= ios_base::failbit; 3068227825Stheraven return false; 3069227825Stheraven } 3070227825Stheraven } 3071227825Stheraven // drop through 3072227825Stheraven case money_base::none: 3073227825Stheraven if (__p != 3) 3074227825Stheraven { 3075227825Stheraven while (__b != __e && __ct.is(ctype_base::space, *__b)) 3076227825Stheraven ++__b; 3077227825Stheraven } 3078227825Stheraven break; 3079227825Stheraven case money_base::sign: 3080227825Stheraven if (__psn.size() + __nsn.size() > 0) 3081227825Stheraven { 3082227825Stheraven if (__psn.size() == 0 || __nsn.size() == 0) 3083227825Stheraven { // sign is optional 3084227825Stheraven if (__psn.size() > 0) 3085227825Stheraven { // __nsn.size() == 0 3086227825Stheraven if (*__b == __psn[0]) 3087227825Stheraven { 3088227825Stheraven ++__b; 3089227825Stheraven if (__psn.size() > 1) 3090227825Stheraven __trailing_sign = &__psn; 3091227825Stheraven } 3092227825Stheraven else 3093227825Stheraven __neg = true; 3094227825Stheraven } 3095227825Stheraven else if (*__b == __nsn[0]) // __nsn.size() > 0 && __psn.size() == 0 3096227825Stheraven { 3097227825Stheraven ++__b; 3098227825Stheraven __neg = true; 3099227825Stheraven if (__nsn.size() > 1) 3100227825Stheraven __trailing_sign = &__nsn; 3101227825Stheraven } 3102227825Stheraven } 3103227825Stheraven else // sign is required 3104227825Stheraven { 3105227825Stheraven if (*__b == __psn[0]) 3106227825Stheraven { 3107227825Stheraven ++__b; 3108227825Stheraven if (__psn.size() > 1) 3109227825Stheraven __trailing_sign = &__psn; 3110227825Stheraven } 3111227825Stheraven else if (*__b == __nsn[0]) 3112227825Stheraven { 3113227825Stheraven ++__b; 3114227825Stheraven __neg = true; 3115227825Stheraven if (__nsn.size() > 1) 3116227825Stheraven __trailing_sign = &__nsn; 3117227825Stheraven } 3118227825Stheraven else 3119227825Stheraven { 3120227825Stheraven __err |= ios_base::failbit; 3121227825Stheraven return false; 3122227825Stheraven } 3123227825Stheraven } 3124227825Stheraven } 3125227825Stheraven break; 3126227825Stheraven case money_base::symbol: 3127227825Stheraven { 3128227825Stheraven bool __more_needed = __trailing_sign || 3129227825Stheraven (__p < 2) || 3130227825Stheraven (__p == 2 && __pat.field[3] != static_cast<char>(money_base::none)); 3131227825Stheraven bool __sb = __flags & ios_base::showbase; 3132227825Stheraven if (__sb || __more_needed) 3133227825Stheraven { 3134227825Stheraven ios_base::iostate __et = ios_base::goodbit; 3135227825Stheraven string_type* __k = __scan_keyword(__b, __e, &__sym, &__sym+1, 3136227825Stheraven __ct, __et); 3137227825Stheraven if (__sb && __k != &__sym) 3138227825Stheraven { 3139227825Stheraven __err |= ios_base::failbit; 3140227825Stheraven return false; 3141227825Stheraven } 3142227825Stheraven } 3143227825Stheraven } 3144227825Stheraven break; 3145227825Stheraven case money_base::value: 3146227825Stheraven { 3147227825Stheraven unsigned __ng = 0; 3148227825Stheraven for (; __b != __e; ++__b) 3149227825Stheraven { 3150227825Stheraven char_type __c = *__b; 3151227825Stheraven if (__ct.is(ctype_base::digit, __c)) 3152227825Stheraven { 3153227825Stheraven if (__wn == __we) 3154227825Stheraven __double_or_nothing(__wb, __wn, __we); 3155227825Stheraven *__wn++ = __c; 3156227825Stheraven ++__ng; 3157227825Stheraven } 3158227825Stheraven else if (__grp.size() > 0 && __ng > 0 && __c == __ts) 3159227825Stheraven { 3160227825Stheraven if (__gn == __ge) 3161227825Stheraven __double_or_nothing(__gb, __gn, __ge); 3162227825Stheraven *__gn++ = __ng; 3163227825Stheraven __ng = 0; 3164227825Stheraven } 3165227825Stheraven else 3166227825Stheraven break; 3167227825Stheraven } 3168227825Stheraven if (__gb.get() != __gn && __ng > 0) 3169227825Stheraven { 3170227825Stheraven if (__gn == __ge) 3171227825Stheraven __double_or_nothing(__gb, __gn, __ge); 3172227825Stheraven *__gn++ = __ng; 3173227825Stheraven } 3174227825Stheraven if (__fd > 0) 3175227825Stheraven { 3176227825Stheraven if (__b == __e || *__b != __dp) 3177227825Stheraven { 3178227825Stheraven __err |= ios_base::failbit; 3179227825Stheraven return false; 3180227825Stheraven } 3181227825Stheraven for (++__b; __fd > 0; --__fd, ++__b) 3182227825Stheraven { 3183227825Stheraven if (__b == __e || !__ct.is(ctype_base::digit, *__b)) 3184227825Stheraven { 3185227825Stheraven __err |= ios_base::failbit; 3186227825Stheraven return false; 3187227825Stheraven } 3188227825Stheraven if (__wn == __we) 3189227825Stheraven __double_or_nothing(__wb, __wn, __we); 3190227825Stheraven *__wn++ = *__b; 3191227825Stheraven } 3192227825Stheraven } 3193227825Stheraven if (__wn == __wb.get()) 3194227825Stheraven { 3195227825Stheraven __err |= ios_base::failbit; 3196227825Stheraven return false; 3197227825Stheraven } 3198227825Stheraven } 3199227825Stheraven break; 3200227825Stheraven } 3201227825Stheraven } 3202227825Stheraven if (__trailing_sign) 3203227825Stheraven { 3204227825Stheraven for (unsigned __i = 1; __i < __trailing_sign->size(); ++__i, ++__b) 3205227825Stheraven { 3206227825Stheraven if (__b == __e || *__b != (*__trailing_sign)[__i]) 3207227825Stheraven { 3208227825Stheraven __err |= ios_base::failbit; 3209227825Stheraven return false; 3210227825Stheraven } 3211227825Stheraven } 3212227825Stheraven } 3213227825Stheraven if (__gb.get() != __gn) 3214227825Stheraven { 3215227825Stheraven ios_base::iostate __et = ios_base::goodbit; 3216227825Stheraven __check_grouping(__grp, __gb.get(), __gn, __et); 3217227825Stheraven if (__et) 3218227825Stheraven { 3219227825Stheraven __err |= ios_base::failbit; 3220227825Stheraven return false; 3221227825Stheraven } 3222227825Stheraven } 3223227825Stheraven return true; 3224227825Stheraven} 3225227825Stheraven 3226227825Stheraventemplate <class _CharT, class _InputIterator> 3227227825Stheraven_InputIterator 3228227825Stheravenmoney_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 3229227825Stheraven bool __intl, ios_base& __iob, 3230227825Stheraven ios_base::iostate& __err, 3231227825Stheraven long double& __v) const 3232227825Stheraven{ 3233227825Stheraven const unsigned __bz = 100; 3234227825Stheraven char_type __wbuf[__bz]; 3235227825Stheraven unique_ptr<char_type, void(*)(void*)> __wb(__wbuf, __do_nothing); 3236227825Stheraven char_type* __wn; 3237227825Stheraven char_type* __we = __wbuf + __bz; 3238227825Stheraven locale __loc = __iob.getloc(); 3239227825Stheraven const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__loc); 3240227825Stheraven bool __neg = false; 3241227825Stheraven if (__do_get(__b, __e, __intl, __loc, __iob.flags(), __err, __neg, __ct, 3242227825Stheraven __wb, __wn, __we)) 3243227825Stheraven { 3244227825Stheraven const char __src[] = "0123456789"; 3245227825Stheraven char_type __atoms[sizeof(__src)-1]; 3246227825Stheraven __ct.widen(__src, __src + (sizeof(__src)-1), __atoms); 3247227825Stheraven char __nbuf[__bz]; 3248227825Stheraven char* __nc = __nbuf; 3249227825Stheraven unique_ptr<char, void(*)(void*)> __h(0, free); 3250227825Stheraven if (__wn - __wb.get() > __bz-2) 3251227825Stheraven { 3252227825Stheraven __h.reset((char*)malloc(__wn - __wb.get() + 2)); 3253227825Stheraven if (__h.get() == 0) 3254227825Stheraven __throw_bad_alloc(); 3255227825Stheraven __nc = __h.get(); 3256227825Stheraven } 3257227825Stheraven if (__neg) 3258227825Stheraven *__nc++ = '-'; 3259227825Stheraven for (const char_type* __w = __wb.get(); __w < __wn; ++__w, ++__nc) 3260227825Stheraven *__nc = __src[find(__atoms, __atoms+sizeof(__atoms), *__w) - __atoms]; 3261227825Stheraven *__nc = char(); 3262227825Stheraven if (sscanf(__nbuf, "%Lf", &__v) != 1) 3263227825Stheraven __throw_runtime_error("money_get error"); 3264227825Stheraven } 3265227825Stheraven if (__b == __e) 3266227825Stheraven __err |= ios_base::eofbit; 3267227825Stheraven return __b; 3268227825Stheraven} 3269227825Stheraven 3270227825Stheraventemplate <class _CharT, class _InputIterator> 3271227825Stheraven_InputIterator 3272227825Stheravenmoney_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, 3273227825Stheraven bool __intl, ios_base& __iob, 3274227825Stheraven ios_base::iostate& __err, 3275227825Stheraven string_type& __v) const 3276227825Stheraven{ 3277227825Stheraven const unsigned __bz = 100; 3278227825Stheraven char_type __wbuf[__bz]; 3279227825Stheraven unique_ptr<char_type, void(*)(void*)> __wb(__wbuf, __do_nothing); 3280227825Stheraven char_type* __wn; 3281227825Stheraven char_type* __we = __wbuf + __bz; 3282227825Stheraven locale __loc = __iob.getloc(); 3283227825Stheraven const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__loc); 3284227825Stheraven bool __neg = false; 3285227825Stheraven if (__do_get(__b, __e, __intl, __loc, __iob.flags(), __err, __neg, __ct, 3286227825Stheraven __wb, __wn, __we)) 3287227825Stheraven { 3288227825Stheraven __v.clear(); 3289227825Stheraven if (__neg) 3290227825Stheraven __v.push_back(__ct.widen('-')); 3291227825Stheraven char_type __z = __ct.widen('0'); 3292227825Stheraven char_type* __w; 3293227825Stheraven for (__w = __wb.get(); __w < __wn-1; ++__w) 3294227825Stheraven if (*__w != __z) 3295227825Stheraven break; 3296227825Stheraven __v.append(__w, __wn); 3297227825Stheraven } 3298227825Stheraven if (__b == __e) 3299227825Stheraven __err |= ios_base::eofbit; 3300227825Stheraven return __b; 3301227825Stheraven} 3302227825Stheraven 3303227825Stheravenextern template class money_get<char>; 3304227825Stheravenextern template class money_get<wchar_t>; 3305227825Stheraven 3306227825Stheraven// money_put 3307227825Stheraven 3308227825Stheraventemplate <class _CharT> 3309227825Stheravenclass __money_put 3310227825Stheraven{ 3311227825Stheravenprotected: 3312227825Stheraven typedef _CharT char_type; 3313227825Stheraven typedef basic_string<char_type> string_type; 3314227825Stheraven 3315227825Stheraven _LIBCPP_ALWAYS_INLINE __money_put() {} 3316227825Stheraven 3317227825Stheraven static void __gather_info(bool __intl, bool __neg, const locale& __loc, 3318227825Stheraven money_base::pattern& __pat, char_type& __dp, 3319227825Stheraven char_type& __ts, string& __grp, 3320227825Stheraven string_type& __sym, string_type& __sn, 3321227825Stheraven int& __fd); 3322227825Stheraven static void __format(char_type* __mb, char_type*& __mi, char_type*& __me, 3323227825Stheraven ios_base::fmtflags __flags, 3324227825Stheraven const char_type* __db, const char_type* __de, 3325227825Stheraven const ctype<char_type>& __ct, bool __neg, 3326227825Stheraven const money_base::pattern& __pat, char_type __dp, 3327227825Stheraven char_type __ts, const string& __grp, 3328227825Stheraven const string_type& __sym, const string_type& __sn, 3329227825Stheraven int __fd); 3330227825Stheraven}; 3331227825Stheraven 3332227825Stheraventemplate <class _CharT> 3333227825Stheravenvoid 3334227825Stheraven__money_put<_CharT>::__gather_info(bool __intl, bool __neg, const locale& __loc, 3335227825Stheraven money_base::pattern& __pat, char_type& __dp, 3336227825Stheraven char_type& __ts, string& __grp, 3337227825Stheraven string_type& __sym, string_type& __sn, 3338227825Stheraven int& __fd) 3339227825Stheraven{ 3340227825Stheraven if (__intl) 3341227825Stheraven { 3342227825Stheraven const moneypunct<char_type, true>& __mp = 3343227825Stheraven use_facet<moneypunct<char_type, true> >(__loc); 3344227825Stheraven if (__neg) 3345227825Stheraven { 3346227825Stheraven __pat = __mp.neg_format(); 3347227825Stheraven __sn = __mp.negative_sign(); 3348227825Stheraven } 3349227825Stheraven else 3350227825Stheraven { 3351227825Stheraven __pat = __mp.pos_format(); 3352227825Stheraven __sn = __mp.positive_sign(); 3353227825Stheraven } 3354227825Stheraven __dp = __mp.decimal_point(); 3355227825Stheraven __ts = __mp.thousands_sep(); 3356227825Stheraven __grp = __mp.grouping(); 3357227825Stheraven __sym = __mp.curr_symbol(); 3358227825Stheraven __fd = __mp.frac_digits(); 3359227825Stheraven } 3360227825Stheraven else 3361227825Stheraven { 3362227825Stheraven const moneypunct<char_type, false>& __mp = 3363227825Stheraven use_facet<moneypunct<char_type, false> >(__loc); 3364227825Stheraven if (__neg) 3365227825Stheraven { 3366227825Stheraven __pat = __mp.neg_format(); 3367227825Stheraven __sn = __mp.negative_sign(); 3368227825Stheraven } 3369227825Stheraven else 3370227825Stheraven { 3371227825Stheraven __pat = __mp.pos_format(); 3372227825Stheraven __sn = __mp.positive_sign(); 3373227825Stheraven } 3374227825Stheraven __dp = __mp.decimal_point(); 3375227825Stheraven __ts = __mp.thousands_sep(); 3376227825Stheraven __grp = __mp.grouping(); 3377227825Stheraven __sym = __mp.curr_symbol(); 3378227825Stheraven __fd = __mp.frac_digits(); 3379227825Stheraven } 3380227825Stheraven} 3381227825Stheraven 3382227825Stheraventemplate <class _CharT> 3383227825Stheravenvoid 3384227825Stheraven__money_put<_CharT>::__format(char_type* __mb, char_type*& __mi, char_type*& __me, 3385227825Stheraven ios_base::fmtflags __flags, 3386227825Stheraven const char_type* __db, const char_type* __de, 3387227825Stheraven const ctype<char_type>& __ct, bool __neg, 3388227825Stheraven const money_base::pattern& __pat, char_type __dp, 3389227825Stheraven char_type __ts, const string& __grp, 3390227825Stheraven const string_type& __sym, const string_type& __sn, 3391227825Stheraven int __fd) 3392227825Stheraven{ 3393227825Stheraven __me = __mb; 3394227825Stheraven for (unsigned __p = 0; __p < 4; ++__p) 3395227825Stheraven { 3396227825Stheraven switch (__pat.field[__p]) 3397227825Stheraven { 3398227825Stheraven case money_base::none: 3399227825Stheraven __mi = __me; 3400227825Stheraven break; 3401227825Stheraven case money_base::space: 3402227825Stheraven __mi = __me; 3403227825Stheraven *__me++ = __ct.widen(' '); 3404227825Stheraven break; 3405227825Stheraven case money_base::sign: 3406227825Stheraven if (!__sn.empty()) 3407227825Stheraven *__me++ = __sn[0]; 3408227825Stheraven break; 3409227825Stheraven case money_base::symbol: 3410227825Stheraven if (!__sym.empty() && (__flags & ios_base::showbase)) 3411227825Stheraven __me = _VSTD::copy(__sym.begin(), __sym.end(), __me); 3412227825Stheraven break; 3413227825Stheraven case money_base::value: 3414227825Stheraven { 3415227825Stheraven // remember start of value so we can reverse it 3416227825Stheraven char_type* __t = __me; 3417227825Stheraven // find beginning of digits 3418227825Stheraven if (__neg) 3419227825Stheraven ++__db; 3420227825Stheraven // find end of digits 3421227825Stheraven const char_type* __d; 3422227825Stheraven for (__d = __db; __d < __de; ++__d) 3423227825Stheraven if (!__ct.is(ctype_base::digit, *__d)) 3424227825Stheraven break; 3425227825Stheraven // print fractional part 3426227825Stheraven if (__fd > 0) 3427227825Stheraven { 3428227825Stheraven int __f; 3429227825Stheraven for (__f = __fd; __d > __db && __f > 0; --__f) 3430227825Stheraven *__me++ = *--__d; 3431227825Stheraven char_type __z = __f > 0 ? __ct.widen('0') : char_type(); 3432227825Stheraven for (; __f > 0; --__f) 3433227825Stheraven *__me++ = __z; 3434227825Stheraven *__me++ = __dp; 3435227825Stheraven } 3436227825Stheraven // print units part 3437227825Stheraven if (__d == __db) 3438227825Stheraven { 3439227825Stheraven *__me++ = __ct.widen('0'); 3440227825Stheraven } 3441227825Stheraven else 3442227825Stheraven { 3443227825Stheraven unsigned __ng = 0; 3444227825Stheraven unsigned __ig = 0; 3445227825Stheraven unsigned __gl = __grp.empty() ? numeric_limits<unsigned>::max() 3446227825Stheraven : static_cast<unsigned>(__grp[__ig]); 3447227825Stheraven while (__d != __db) 3448227825Stheraven { 3449227825Stheraven if (__ng == __gl) 3450227825Stheraven { 3451227825Stheraven *__me++ = __ts; 3452227825Stheraven __ng = 0; 3453227825Stheraven if (++__ig < __grp.size()) 3454227825Stheraven __gl = __grp[__ig] == numeric_limits<char>::max() ? 3455227825Stheraven numeric_limits<unsigned>::max() : 3456227825Stheraven static_cast<unsigned>(__grp[__ig]); 3457227825Stheraven } 3458227825Stheraven *__me++ = *--__d; 3459227825Stheraven ++__ng; 3460227825Stheraven } 3461227825Stheraven } 3462227825Stheraven // reverse it 3463227825Stheraven reverse(__t, __me); 3464227825Stheraven } 3465227825Stheraven break; 3466227825Stheraven } 3467227825Stheraven } 3468227825Stheraven // print rest of sign, if any 3469227825Stheraven if (__sn.size() > 1) 3470227825Stheraven __me = _VSTD::copy(__sn.begin()+1, __sn.end(), __me); 3471227825Stheraven // set alignment 3472227825Stheraven if ((__flags & ios_base::adjustfield) == ios_base::left) 3473227825Stheraven __mi = __me; 3474227825Stheraven else if ((__flags & ios_base::adjustfield) != ios_base::internal) 3475227825Stheraven __mi = __mb; 3476227825Stheraven} 3477227825Stheraven 3478227825Stheravenextern template class __money_put<char>; 3479227825Stheravenextern template class __money_put<wchar_t>; 3480227825Stheraven 3481227825Stheraventemplate <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> > 3482227825Stheravenclass _LIBCPP_VISIBLE money_put 3483227825Stheraven : public locale::facet, 3484227825Stheraven private __money_put<_CharT> 3485227825Stheraven{ 3486227825Stheravenpublic: 3487227825Stheraven typedef _CharT char_type; 3488227825Stheraven typedef _OutputIterator iter_type; 3489227825Stheraven typedef basic_string<char_type> string_type; 3490227825Stheraven 3491227825Stheraven _LIBCPP_ALWAYS_INLINE 3492227825Stheraven explicit money_put(size_t __refs = 0) 3493227825Stheraven : locale::facet(__refs) {} 3494227825Stheraven 3495227825Stheraven _LIBCPP_ALWAYS_INLINE 3496227825Stheraven iter_type put(iter_type __s, bool __intl, ios_base& __iob, char_type __fl, 3497227825Stheraven long double __units) const 3498227825Stheraven { 3499227825Stheraven return do_put(__s, __intl, __iob, __fl, __units); 3500227825Stheraven } 3501227825Stheraven 3502227825Stheraven _LIBCPP_ALWAYS_INLINE 3503227825Stheraven iter_type put(iter_type __s, bool __intl, ios_base& __iob, char_type __fl, 3504227825Stheraven const string_type& __digits) const 3505227825Stheraven { 3506227825Stheraven return do_put(__s, __intl, __iob, __fl, __digits); 3507227825Stheraven } 3508227825Stheraven 3509227825Stheraven static locale::id id; 3510227825Stheraven 3511227825Stheravenprotected: 3512227825Stheraven _LIBCPP_ALWAYS_INLINE 3513227825Stheraven ~money_put() {} 3514227825Stheraven 3515227825Stheraven virtual iter_type do_put(iter_type __s, bool __intl, ios_base& __iob, 3516227825Stheraven char_type __fl, long double __units) const; 3517227825Stheraven virtual iter_type do_put(iter_type __s, bool __intl, ios_base& __iob, 3518227825Stheraven char_type __fl, const string_type& __digits) const; 3519227825Stheraven}; 3520227825Stheraven 3521227825Stheraventemplate <class _CharT, class _OutputIterator> 3522227825Stheravenlocale::id 3523227825Stheravenmoney_put<_CharT, _OutputIterator>::id; 3524227825Stheraven 3525227825Stheraventemplate <class _CharT, class _OutputIterator> 3526227825Stheraven_OutputIterator 3527227825Stheravenmoney_put<_CharT, _OutputIterator>::do_put(iter_type __s, bool __intl, 3528227825Stheraven ios_base& __iob, char_type __fl, 3529227825Stheraven long double __units) const 3530227825Stheraven{ 3531227825Stheraven // convert to char 3532227825Stheraven const size_t __bs = 100; 3533227825Stheraven char __buf[__bs]; 3534227825Stheraven char* __bb = __buf; 3535227825Stheraven char_type __digits[__bs]; 3536227825Stheraven char_type* __db = __digits; 3537227825Stheraven size_t __n = snprintf(__bb, __bs, "%.0Lf", __units); 3538227825Stheraven unique_ptr<char, void(*)(void*)> __hn(0, free); 3539227825Stheraven unique_ptr<char_type, void(*)(void*)> __hd(0, free); 3540227825Stheraven // secure memory for digit storage 3541227825Stheraven if (__n > __bs-1) 3542227825Stheraven { 3543227825Stheraven#ifdef _LIBCPP_LOCALE__L_EXTENSIONS 3544227825Stheraven __n = asprintf_l(&__bb, _LIBCPP_GET_C_LOCALE, "%.0Lf", __units); 3545227825Stheraven#else 3546227825Stheraven __n = __asprintf_l(&__bb, __cloc(), "%.0Lf", __units); 3547227825Stheraven#endif 3548227825Stheraven if (__bb == 0) 3549227825Stheraven __throw_bad_alloc(); 3550227825Stheraven __hn.reset(__bb); 3551227825Stheraven __hd.reset((char_type*)malloc(__n * sizeof(char_type))); 3552227825Stheraven if (__hd == 0) 3553227825Stheraven __throw_bad_alloc(); 3554227825Stheraven __db = __hd.get(); 3555227825Stheraven } 3556227825Stheraven // gather info 3557227825Stheraven locale __loc = __iob.getloc(); 3558227825Stheraven const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__loc); 3559227825Stheraven __ct.widen(__bb, __bb + __n, __db); 3560227825Stheraven bool __neg = __n > 0 && __bb[0] == '-'; 3561227825Stheraven money_base::pattern __pat; 3562227825Stheraven char_type __dp; 3563227825Stheraven char_type __ts; 3564227825Stheraven string __grp; 3565227825Stheraven string_type __sym; 3566227825Stheraven string_type __sn; 3567227825Stheraven int __fd; 3568227825Stheraven this->__gather_info(__intl, __neg, __loc, __pat, __dp, __ts, __grp, __sym, __sn, __fd); 3569227825Stheraven // secure memory for formatting 3570227825Stheraven char_type __mbuf[__bs]; 3571227825Stheraven char_type* __mb = __mbuf; 3572227825Stheraven unique_ptr<char_type, void(*)(void*)> __hw(0, free); 3573227825Stheraven size_t __exn = static_cast<int>(__n) > __fd ? 3574227825Stheraven (__n - __fd) * 2 + __sn.size() + __sym.size() + __fd + 1 3575227825Stheraven : __sn.size() + __sym.size() + __fd + 2; 3576227825Stheraven if (__exn > __bs) 3577227825Stheraven { 3578227825Stheraven __hw.reset((char_type*)malloc(__exn * sizeof(char_type))); 3579227825Stheraven __mb = __hw.get(); 3580227825Stheraven if (__mb == 0) 3581227825Stheraven __throw_bad_alloc(); 3582227825Stheraven } 3583227825Stheraven // format 3584227825Stheraven char_type* __mi; 3585227825Stheraven char_type* __me; 3586227825Stheraven this->__format(__mb, __mi, __me, __iob.flags(), 3587227825Stheraven __db, __db + __n, __ct, 3588227825Stheraven __neg, __pat, __dp, __ts, __grp, __sym, __sn, __fd); 3589227825Stheraven return __pad_and_output(__s, __mb, __mi, __me, __iob, __fl); 3590227825Stheraven} 3591227825Stheraven 3592227825Stheraventemplate <class _CharT, class _OutputIterator> 3593227825Stheraven_OutputIterator 3594227825Stheravenmoney_put<_CharT, _OutputIterator>::do_put(iter_type __s, bool __intl, 3595227825Stheraven ios_base& __iob, char_type __fl, 3596227825Stheraven const string_type& __digits) const 3597227825Stheraven{ 3598227825Stheraven // gather info 3599227825Stheraven locale __loc = __iob.getloc(); 3600227825Stheraven const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__loc); 3601227825Stheraven bool __neg = __digits.size() > 0 && __digits[0] == __ct.widen('-'); 3602227825Stheraven money_base::pattern __pat; 3603227825Stheraven char_type __dp; 3604227825Stheraven char_type __ts; 3605227825Stheraven string __grp; 3606227825Stheraven string_type __sym; 3607227825Stheraven string_type __sn; 3608227825Stheraven int __fd; 3609227825Stheraven this->__gather_info(__intl, __neg, __loc, __pat, __dp, __ts, __grp, __sym, __sn, __fd); 3610227825Stheraven // secure memory for formatting 3611227825Stheraven char_type __mbuf[100]; 3612227825Stheraven char_type* __mb = __mbuf; 3613227825Stheraven unique_ptr<char_type, void(*)(void*)> __h(0, free); 3614227825Stheraven size_t __exn = __digits.size() > __fd ? 3615227825Stheraven (__digits.size() - __fd) * 2 + __sn.size() + __sym.size() + __fd + 1 3616227825Stheraven : __sn.size() + __sym.size() + __fd + 2; 3617227825Stheraven if (__exn > 100) 3618227825Stheraven { 3619227825Stheraven __h.reset((char_type*)malloc(__exn * sizeof(char_type))); 3620227825Stheraven __mb = __h.get(); 3621227825Stheraven if (__mb == 0) 3622227825Stheraven __throw_bad_alloc(); 3623227825Stheraven } 3624227825Stheraven // format 3625227825Stheraven char_type* __mi; 3626227825Stheraven char_type* __me; 3627227825Stheraven this->__format(__mb, __mi, __me, __iob.flags(), 3628227825Stheraven __digits.data(), __digits.data() + __digits.size(), __ct, 3629227825Stheraven __neg, __pat, __dp, __ts, __grp, __sym, __sn, __fd); 3630227825Stheraven return __pad_and_output(__s, __mb, __mi, __me, __iob, __fl); 3631227825Stheraven} 3632227825Stheraven 3633227825Stheravenextern template class money_put<char>; 3634227825Stheravenextern template class money_put<wchar_t>; 3635227825Stheraven 3636227825Stheraven// messages 3637227825Stheraven 3638227825Stheravenclass _LIBCPP_VISIBLE messages_base 3639227825Stheraven{ 3640227825Stheravenpublic: 3641227825Stheraven typedef ptrdiff_t catalog; 3642227825Stheraven 3643227825Stheraven _LIBCPP_ALWAYS_INLINE messages_base() {} 3644227825Stheraven}; 3645227825Stheraven 3646227825Stheraventemplate <class _CharT> 3647227825Stheravenclass _LIBCPP_VISIBLE messages 3648227825Stheraven : public locale::facet, 3649227825Stheraven public messages_base 3650227825Stheraven{ 3651227825Stheravenpublic: 3652227825Stheraven typedef _CharT char_type; 3653227825Stheraven typedef basic_string<_CharT> string_type; 3654227825Stheraven 3655227825Stheraven _LIBCPP_ALWAYS_INLINE 3656227825Stheraven explicit messages(size_t __refs = 0) 3657227825Stheraven : locale::facet(__refs) {} 3658227825Stheraven 3659227825Stheraven _LIBCPP_ALWAYS_INLINE 3660227825Stheraven catalog open(const basic_string<char>& __nm, const locale& __loc) const 3661227825Stheraven { 3662227825Stheraven return do_open(__nm, __loc); 3663227825Stheraven } 3664227825Stheraven 3665227825Stheraven _LIBCPP_ALWAYS_INLINE 3666227825Stheraven string_type get(catalog __c, int __set, int __msgid, 3667227825Stheraven const string_type& __dflt) const 3668227825Stheraven { 3669227825Stheraven return do_get(__c, __set, __msgid, __dflt); 3670227825Stheraven } 3671227825Stheraven 3672227825Stheraven _LIBCPP_ALWAYS_INLINE 3673227825Stheraven void close(catalog __c) const 3674227825Stheraven { 3675227825Stheraven do_close(__c); 3676227825Stheraven } 3677227825Stheraven 3678227825Stheraven static locale::id id; 3679227825Stheraven 3680227825Stheravenprotected: 3681227825Stheraven _LIBCPP_ALWAYS_INLINE 3682227825Stheraven ~messages() {} 3683227825Stheraven 3684227825Stheraven virtual catalog do_open(const basic_string<char>&, const locale&) const; 3685227825Stheraven virtual string_type do_get(catalog, int __set, int __msgid, 3686227825Stheraven const string_type& __dflt) const; 3687227825Stheraven virtual void do_close(catalog) const; 3688227825Stheraven}; 3689227825Stheraven 3690227825Stheraventemplate <class _CharT> 3691227825Stheravenlocale::id 3692227825Stheravenmessages<_CharT>::id; 3693227825Stheraven 3694227825Stheraventemplate <class _CharT> 3695227825Stheraventypename messages<_CharT>::catalog 3696227825Stheravenmessages<_CharT>::do_open(const basic_string<char>& __nm, const locale&) const 3697227825Stheraven{ 3698227825Stheraven#if _WIN32 3699227825Stheraven return -1; 3700227825Stheraven#else // _WIN32 3701227825Stheraven catalog __cat = (catalog)catopen(__nm.c_str(), NL_CAT_LOCALE); 3702227825Stheraven if (__cat != -1) 3703227825Stheraven __cat = static_cast<catalog>((static_cast<size_t>(__cat) >> 1)); 3704227825Stheraven return __cat; 3705227825Stheraven#endif // _WIN32 3706227825Stheraven} 3707227825Stheraven 3708227825Stheraventemplate <class _CharT> 3709227825Stheraventypename messages<_CharT>::string_type 3710227825Stheravenmessages<_CharT>::do_get(catalog __c, int __set, int __msgid, 3711227825Stheraven const string_type& __dflt) const 3712227825Stheraven{ 3713227825Stheraven#if _WIN32 3714227825Stheraven return __dflt; 3715227825Stheraven#else // _WIN32 3716227825Stheraven string __ndflt; 3717227825Stheraven __narrow_to_utf8<sizeof(char_type)*__CHAR_BIT__>()(back_inserter(__ndflt), 3718227825Stheraven __dflt.c_str(), 3719227825Stheraven __dflt.c_str() + __dflt.size()); 3720227825Stheraven if (__c != -1) 3721227825Stheraven __c <<= 1; 3722227825Stheraven nl_catd __cat = (nl_catd)__c; 3723227825Stheraven char* __n = catgets(__cat, __set, __msgid, __ndflt.c_str()); 3724227825Stheraven string_type __w; 3725227825Stheraven __widen_from_utf8<sizeof(char_type)*__CHAR_BIT__>()(back_inserter(__w), 3726227825Stheraven __n, __n + strlen(__n)); 3727227825Stheraven return __w; 3728227825Stheraven#endif // _WIN32 3729227825Stheraven} 3730227825Stheraven 3731227825Stheraventemplate <class _CharT> 3732227825Stheravenvoid 3733227825Stheravenmessages<_CharT>::do_close(catalog __c) const 3734227825Stheraven{ 3735227825Stheraven#if !_WIN32 3736227825Stheraven if (__c != -1) 3737227825Stheraven __c <<= 1; 3738227825Stheraven nl_catd __cat = (nl_catd)__c; 3739227825Stheraven catclose(__cat); 3740227825Stheraven#endif // !_WIN32 3741227825Stheraven} 3742227825Stheraven 3743227825Stheravenextern template class messages<char>; 3744227825Stheravenextern template class messages<wchar_t>; 3745227825Stheraven 3746227825Stheraventemplate <class _CharT> 3747227825Stheravenclass _LIBCPP_VISIBLE messages_byname 3748227825Stheraven : public messages<_CharT> 3749227825Stheraven{ 3750227825Stheravenpublic: 3751227825Stheraven typedef messages_base::catalog catalog; 3752227825Stheraven typedef basic_string<_CharT> string_type; 3753227825Stheraven 3754227825Stheraven _LIBCPP_ALWAYS_INLINE 3755227825Stheraven explicit messages_byname(const char*, size_t __refs = 0) 3756227825Stheraven : messages<_CharT>(__refs) {} 3757227825Stheraven 3758227825Stheraven _LIBCPP_ALWAYS_INLINE 3759227825Stheraven explicit messages_byname(const string&, size_t __refs = 0) 3760227825Stheraven : messages<_CharT>(__refs) {} 3761227825Stheraven 3762227825Stheravenprotected: 3763227825Stheraven _LIBCPP_ALWAYS_INLINE 3764227825Stheraven ~messages_byname() {} 3765227825Stheraven}; 3766227825Stheraven 3767227825Stheravenextern template class messages_byname<char>; 3768227825Stheravenextern template class messages_byname<wchar_t>; 3769227825Stheraven 3770227825Stheraventemplate<class _Codecvt, class _Elem = wchar_t, 3771227825Stheraven class _Wide_alloc = allocator<_Elem>, 3772227825Stheraven class _Byte_alloc = allocator<char> > 3773227825Stheravenclass _LIBCPP_VISIBLE wstring_convert 3774227825Stheraven{ 3775227825Stheravenpublic: 3776227825Stheraven typedef basic_string<char, char_traits<char>, _Byte_alloc> byte_string; 3777227825Stheraven typedef basic_string<_Elem, char_traits<_Elem>, _Wide_alloc> wide_string; 3778227825Stheraven typedef typename _Codecvt::state_type state_type; 3779227825Stheraven typedef typename wide_string::traits_type::int_type int_type; 3780227825Stheraven 3781227825Stheravenprivate: 3782227825Stheraven byte_string __byte_err_string_; 3783227825Stheraven wide_string __wide_err_string_; 3784227825Stheraven _Codecvt* __cvtptr_; 3785227825Stheraven state_type __cvtstate_; 3786227825Stheraven size_t __cvtcount_; 3787227825Stheraven 3788227825Stheraven wstring_convert(const wstring_convert& __wc); 3789227825Stheraven wstring_convert& operator=(const wstring_convert& __wc); 3790227825Stheravenpublic: 3791227825Stheraven wstring_convert(_Codecvt* __pcvt = new _Codecvt); 3792227825Stheraven wstring_convert(_Codecvt* __pcvt, state_type __state); 3793227825Stheraven wstring_convert(const byte_string& __byte_err, 3794227825Stheraven const wide_string& __wide_err = wide_string()); 3795227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3796227825Stheraven wstring_convert(wstring_convert&& __wc); 3797227825Stheraven#endif 3798227825Stheraven ~wstring_convert(); 3799227825Stheraven 3800227825Stheraven _LIBCPP_ALWAYS_INLINE 3801227825Stheraven wide_string from_bytes(char __byte) 3802227825Stheraven {return from_bytes(&__byte, &__byte+1);} 3803227825Stheraven _LIBCPP_ALWAYS_INLINE 3804227825Stheraven wide_string from_bytes(const char* __ptr) 3805227825Stheraven {return from_bytes(__ptr, __ptr + char_traits<char>::length(__ptr));} 3806227825Stheraven _LIBCPP_ALWAYS_INLINE 3807227825Stheraven wide_string from_bytes(const byte_string& __str) 3808227825Stheraven {return from_bytes(__str.data(), __str.data() + __str.size());} 3809227825Stheraven wide_string from_bytes(const char* __first, const char* __last); 3810227825Stheraven 3811227825Stheraven _LIBCPP_ALWAYS_INLINE 3812227825Stheraven byte_string to_bytes(_Elem __wchar) 3813227825Stheraven {return to_bytes(&__wchar, &__wchar+1);} 3814227825Stheraven _LIBCPP_ALWAYS_INLINE 3815227825Stheraven byte_string to_bytes(const _Elem* __wptr) 3816227825Stheraven {return to_bytes(__wptr, __wptr + char_traits<_Elem>::length(__wptr));} 3817227825Stheraven _LIBCPP_ALWAYS_INLINE 3818227825Stheraven byte_string to_bytes(const wide_string& __wstr) 3819227825Stheraven {return to_bytes(__wstr.data(), __wstr.data() + __wstr.size());} 3820227825Stheraven byte_string to_bytes(const _Elem* __first, const _Elem* __last); 3821227825Stheraven 3822227825Stheraven _LIBCPP_ALWAYS_INLINE 3823227825Stheraven size_t converted() const {return __cvtcount_;} 3824227825Stheraven _LIBCPP_ALWAYS_INLINE 3825227825Stheraven state_type state() const {return __cvtstate_;} 3826227825Stheraven}; 3827227825Stheraven 3828227825Stheraventemplate<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> 3829227825Stheraveninline _LIBCPP_ALWAYS_INLINE 3830227825Stheravenwstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: 3831227825Stheraven wstring_convert(_Codecvt* __pcvt) 3832227825Stheraven : __cvtptr_(__pcvt), __cvtstate_(), __cvtcount_(0) 3833227825Stheraven{ 3834227825Stheraven} 3835227825Stheraven 3836227825Stheraventemplate<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> 3837227825Stheraveninline _LIBCPP_ALWAYS_INLINE 3838227825Stheravenwstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: 3839227825Stheraven wstring_convert(_Codecvt* __pcvt, state_type __state) 3840227825Stheraven : __cvtptr_(__pcvt), __cvtstate_(__state), __cvtcount_(0) 3841227825Stheraven{ 3842227825Stheraven} 3843227825Stheraven 3844227825Stheraventemplate<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> 3845227825Stheravenwstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: 3846227825Stheraven wstring_convert(const byte_string& __byte_err, const wide_string& __wide_err) 3847227825Stheraven : __byte_err_string_(__byte_err), __wide_err_string_(__wide_err), 3848227825Stheraven __cvtstate_(), __cvtcount_(0) 3849227825Stheraven{ 3850227825Stheraven __cvtptr_ = new _Codecvt; 3851227825Stheraven} 3852227825Stheraven 3853227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3854227825Stheraven 3855227825Stheraventemplate<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> 3856227825Stheraveninline _LIBCPP_ALWAYS_INLINE 3857227825Stheravenwstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: 3858227825Stheraven wstring_convert(wstring_convert&& __wc) 3859227825Stheraven : __byte_err_string_(_VSTD::move(__wc.__byte_err_string_)), 3860227825Stheraven __wide_err_string_(_VSTD::move(__wc.__wide_err_string_)), 3861227825Stheraven __cvtptr_(__wc.__cvtptr_), 3862227825Stheraven __cvtstate_(__wc.__cvtstate_), __cvtcount_(__wc.__cvtstate_) 3863227825Stheraven{ 3864227825Stheraven __wc.__cvtptr_ = nullptr; 3865227825Stheraven} 3866227825Stheraven 3867227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3868227825Stheraven 3869227825Stheraventemplate<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> 3870227825Stheravenwstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::~wstring_convert() 3871227825Stheraven{ 3872227825Stheraven delete __cvtptr_; 3873227825Stheraven} 3874227825Stheraven 3875227825Stheraventemplate<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> 3876227825Stheraventypename wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::wide_string 3877227825Stheravenwstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: 3878227825Stheraven from_bytes(const char* __frm, const char* __frm_end) 3879227825Stheraven{ 3880227825Stheraven __cvtcount_ = 0; 3881227825Stheraven if (__cvtptr_ != nullptr) 3882227825Stheraven { 3883227825Stheraven wide_string __ws(2*(__frm_end - __frm), _Elem()); 3884227825Stheraven __ws.resize(__ws.capacity()); 3885227825Stheraven codecvt_base::result __r = codecvt_base::ok; 3886227825Stheraven state_type __st = __cvtstate_; 3887227825Stheraven if (__frm != __frm_end) 3888227825Stheraven { 3889227825Stheraven _Elem* __to = &__ws[0]; 3890227825Stheraven _Elem* __to_end = __to + __ws.size(); 3891227825Stheraven const char* __frm_nxt; 3892227825Stheraven do 3893227825Stheraven { 3894227825Stheraven _Elem* __to_nxt; 3895227825Stheraven __r = __cvtptr_->in(__st, __frm, __frm_end, __frm_nxt, 3896227825Stheraven __to, __to_end, __to_nxt); 3897227825Stheraven __cvtcount_ += __frm_nxt - __frm; 3898227825Stheraven if (__frm_nxt == __frm) 3899227825Stheraven { 3900227825Stheraven __r = codecvt_base::error; 3901227825Stheraven } 3902227825Stheraven else if (__r == codecvt_base::noconv) 3903227825Stheraven { 3904227825Stheraven __ws.resize(__to - &__ws[0]); 3905227825Stheraven // This only gets executed if _Elem is char 3906227825Stheraven __ws.append((const _Elem*)__frm, (const _Elem*)__frm_end); 3907227825Stheraven __frm = __frm_nxt; 3908227825Stheraven __r = codecvt_base::ok; 3909227825Stheraven } 3910227825Stheraven else if (__r == codecvt_base::ok) 3911227825Stheraven { 3912227825Stheraven __ws.resize(__to_nxt - &__ws[0]); 3913227825Stheraven __frm = __frm_nxt; 3914227825Stheraven } 3915227825Stheraven else if (__r == codecvt_base::partial) 3916227825Stheraven { 3917227825Stheraven ptrdiff_t __s = __to_nxt - &__ws[0]; 3918227825Stheraven __ws.resize(2 * __s); 3919227825Stheraven __to = &__ws[0] + __s; 3920227825Stheraven __to_end = &__ws[0] + __ws.size(); 3921227825Stheraven __frm = __frm_nxt; 3922227825Stheraven } 3923227825Stheraven } while (__r == codecvt_base::partial && __frm_nxt < __frm_end); 3924227825Stheraven } 3925227825Stheraven if (__r == codecvt_base::ok) 3926227825Stheraven return __ws; 3927227825Stheraven } 3928227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 3929227825Stheraven if (__wide_err_string_.empty()) 3930227825Stheraven throw range_error("wstring_convert: from_bytes error"); 3931227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 3932227825Stheraven return __wide_err_string_; 3933227825Stheraven} 3934227825Stheraven 3935227825Stheraventemplate<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> 3936227825Stheraventypename wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::byte_string 3937227825Stheravenwstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: 3938227825Stheraven to_bytes(const _Elem* __frm, const _Elem* __frm_end) 3939227825Stheraven{ 3940227825Stheraven __cvtcount_ = 0; 3941227825Stheraven if (__cvtptr_ != nullptr) 3942227825Stheraven { 3943227825Stheraven byte_string __bs(2*(__frm_end - __frm), char()); 3944227825Stheraven __bs.resize(__bs.capacity()); 3945227825Stheraven codecvt_base::result __r = codecvt_base::ok; 3946227825Stheraven state_type __st = __cvtstate_; 3947227825Stheraven if (__frm != __frm_end) 3948227825Stheraven { 3949227825Stheraven char* __to = &__bs[0]; 3950227825Stheraven char* __to_end = __to + __bs.size(); 3951227825Stheraven const _Elem* __frm_nxt; 3952227825Stheraven do 3953227825Stheraven { 3954227825Stheraven char* __to_nxt; 3955227825Stheraven __r = __cvtptr_->out(__st, __frm, __frm_end, __frm_nxt, 3956227825Stheraven __to, __to_end, __to_nxt); 3957227825Stheraven __cvtcount_ += __frm_nxt - __frm; 3958227825Stheraven if (__frm_nxt == __frm) 3959227825Stheraven { 3960227825Stheraven __r = codecvt_base::error; 3961227825Stheraven } 3962227825Stheraven else if (__r == codecvt_base::noconv) 3963227825Stheraven { 3964227825Stheraven __bs.resize(__to - &__bs[0]); 3965227825Stheraven // This only gets executed if _Elem is char 3966227825Stheraven __bs.append((const char*)__frm, (const char*)__frm_end); 3967227825Stheraven __frm = __frm_nxt; 3968227825Stheraven __r = codecvt_base::ok; 3969227825Stheraven } 3970227825Stheraven else if (__r == codecvt_base::ok) 3971227825Stheraven { 3972227825Stheraven __bs.resize(__to_nxt - &__bs[0]); 3973227825Stheraven __frm = __frm_nxt; 3974227825Stheraven } 3975227825Stheraven else if (__r == codecvt_base::partial) 3976227825Stheraven { 3977227825Stheraven ptrdiff_t __s = __to_nxt - &__bs[0]; 3978227825Stheraven __bs.resize(2 * __s); 3979227825Stheraven __to = &__bs[0] + __s; 3980227825Stheraven __to_end = &__bs[0] + __bs.size(); 3981227825Stheraven __frm = __frm_nxt; 3982227825Stheraven } 3983227825Stheraven } while (__r == codecvt_base::partial && __frm_nxt < __frm_end); 3984227825Stheraven } 3985227825Stheraven if (__r == codecvt_base::ok) 3986227825Stheraven { 3987227825Stheraven size_t __s = __bs.size(); 3988227825Stheraven __bs.resize(__bs.capacity()); 3989227825Stheraven char* __to = &__bs[0] + __s; 3990227825Stheraven char* __to_end = __to + __bs.size(); 3991227825Stheraven do 3992227825Stheraven { 3993227825Stheraven char* __to_nxt; 3994227825Stheraven __r = __cvtptr_->unshift(__st, __to, __to_end, __to_nxt); 3995227825Stheraven if (__r == codecvt_base::noconv) 3996227825Stheraven { 3997227825Stheraven __bs.resize(__to - &__bs[0]); 3998227825Stheraven __r = codecvt_base::ok; 3999227825Stheraven } 4000227825Stheraven else if (__r == codecvt_base::ok) 4001227825Stheraven { 4002227825Stheraven __bs.resize(__to_nxt - &__bs[0]); 4003227825Stheraven } 4004227825Stheraven else if (__r == codecvt_base::partial) 4005227825Stheraven { 4006227825Stheraven ptrdiff_t __s = __to_nxt - &__bs[0]; 4007227825Stheraven __bs.resize(2 * __s); 4008227825Stheraven __to = &__bs[0] + __s; 4009227825Stheraven __to_end = &__bs[0] + __bs.size(); 4010227825Stheraven } 4011227825Stheraven } while (__r == codecvt_base::partial); 4012227825Stheraven if (__r == codecvt_base::ok) 4013227825Stheraven return __bs; 4014227825Stheraven } 4015227825Stheraven } 4016227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 4017227825Stheraven if (__byte_err_string_.empty()) 4018227825Stheraven throw range_error("wstring_convert: to_bytes error"); 4019227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 4020227825Stheraven return __byte_err_string_; 4021227825Stheraven} 4022227825Stheraven 4023227825Stheraventemplate <class _Codecvt, class _Elem = wchar_t, class _Tr = char_traits<_Elem> > 4024227825Stheravenclass _LIBCPP_VISIBLE wbuffer_convert 4025227825Stheraven : public basic_streambuf<_Elem, _Tr> 4026227825Stheraven{ 4027227825Stheravenpublic: 4028227825Stheraven // types: 4029227825Stheraven typedef _Elem char_type; 4030227825Stheraven typedef _Tr traits_type; 4031227825Stheraven typedef typename traits_type::int_type int_type; 4032227825Stheraven typedef typename traits_type::pos_type pos_type; 4033227825Stheraven typedef typename traits_type::off_type off_type; 4034227825Stheraven typedef typename _Codecvt::state_type state_type; 4035227825Stheraven 4036227825Stheravenprivate: 4037227825Stheraven char* __extbuf_; 4038227825Stheraven const char* __extbufnext_; 4039227825Stheraven const char* __extbufend_; 4040227825Stheraven char __extbuf_min_[8]; 4041227825Stheraven size_t __ebs_; 4042227825Stheraven char_type* __intbuf_; 4043227825Stheraven size_t __ibs_; 4044227825Stheraven streambuf* __bufptr_; 4045227825Stheraven _Codecvt* __cv_; 4046227825Stheraven state_type __st_; 4047227825Stheraven ios_base::openmode __cm_; 4048227825Stheraven bool __owns_eb_; 4049227825Stheraven bool __owns_ib_; 4050227825Stheraven bool __always_noconv_; 4051227825Stheraven 4052227825Stheraven wbuffer_convert(const wbuffer_convert&); 4053227825Stheraven wbuffer_convert& operator=(const wbuffer_convert&); 4054227825Stheravenpublic: 4055227825Stheraven wbuffer_convert(streambuf* __bytebuf = 0, _Codecvt* __pcvt = new _Codecvt, 4056227825Stheraven state_type __state = state_type()); 4057227825Stheraven ~wbuffer_convert(); 4058227825Stheraven 4059227825Stheraven _LIBCPP_INLINE_VISIBILITY 4060227825Stheraven streambuf* rdbuf() const {return __bufptr_;} 4061227825Stheraven _LIBCPP_INLINE_VISIBILITY 4062227825Stheraven streambuf* rdbuf(streambuf* __bytebuf) 4063227825Stheraven { 4064227825Stheraven streambuf* __r = __bufptr_; 4065227825Stheraven __bufptr_ = __bytebuf; 4066227825Stheraven return __r; 4067227825Stheraven } 4068227825Stheraven 4069227825Stheraven _LIBCPP_INLINE_VISIBILITY 4070227825Stheraven state_type state() const {return __st_;} 4071227825Stheraven 4072227825Stheravenprotected: 4073227825Stheraven virtual int_type underflow(); 4074227825Stheraven virtual int_type pbackfail(int_type __c = traits_type::eof()); 4075227825Stheraven virtual int_type overflow (int_type __c = traits_type::eof()); 4076227825Stheraven virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* __s, 4077227825Stheraven streamsize __n); 4078227825Stheraven virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, 4079227825Stheraven ios_base::openmode __wch = ios_base::in | ios_base::out); 4080227825Stheraven virtual pos_type seekpos(pos_type __sp, 4081227825Stheraven ios_base::openmode __wch = ios_base::in | ios_base::out); 4082227825Stheraven virtual int sync(); 4083227825Stheraven 4084227825Stheravenprivate: 4085227825Stheraven bool __read_mode(); 4086227825Stheraven void __write_mode(); 4087227825Stheraven wbuffer_convert* __close(); 4088227825Stheraven}; 4089227825Stheraven 4090227825Stheraventemplate <class _Codecvt, class _Elem, class _Tr> 4091227825Stheravenwbuffer_convert<_Codecvt, _Elem, _Tr>:: 4092227825Stheraven wbuffer_convert(streambuf* __bytebuf, _Codecvt* __pcvt, state_type __state) 4093227825Stheraven : __extbuf_(0), 4094227825Stheraven __extbufnext_(0), 4095227825Stheraven __extbufend_(0), 4096227825Stheraven __ebs_(0), 4097227825Stheraven __intbuf_(0), 4098227825Stheraven __ibs_(0), 4099227825Stheraven __bufptr_(__bytebuf), 4100227825Stheraven __cv_(__pcvt), 4101227825Stheraven __st_(__state), 4102227825Stheraven __cm_(0), 4103227825Stheraven __owns_eb_(false), 4104227825Stheraven __owns_ib_(false), 4105227825Stheraven __always_noconv_(__cv_ ? __cv_->always_noconv() : false) 4106227825Stheraven{ 4107227825Stheraven setbuf(0, 4096); 4108227825Stheraven} 4109227825Stheraven 4110227825Stheraventemplate <class _Codecvt, class _Elem, class _Tr> 4111227825Stheravenwbuffer_convert<_Codecvt, _Elem, _Tr>::~wbuffer_convert() 4112227825Stheraven{ 4113227825Stheraven __close(); 4114227825Stheraven delete __cv_; 4115227825Stheraven if (__owns_eb_) 4116227825Stheraven delete [] __extbuf_; 4117227825Stheraven if (__owns_ib_) 4118227825Stheraven delete [] __intbuf_; 4119227825Stheraven} 4120227825Stheraven 4121227825Stheraventemplate <class _Codecvt, class _Elem, class _Tr> 4122227825Stheraventypename wbuffer_convert<_Codecvt, _Elem, _Tr>::int_type 4123227825Stheravenwbuffer_convert<_Codecvt, _Elem, _Tr>::underflow() 4124227825Stheraven{ 4125227825Stheraven if (__cv_ == 0 || __bufptr_ == 0) 4126227825Stheraven return traits_type::eof(); 4127227825Stheraven bool __initial = __read_mode(); 4128227825Stheraven char_type __1buf; 4129227825Stheraven if (this->gptr() == 0) 4130227825Stheraven this->setg(&__1buf, &__1buf+1, &__1buf+1); 4131227825Stheraven const size_t __unget_sz = __initial ? 0 : min<size_t>((this->egptr() - this->eback()) / 2, 4); 4132227825Stheraven int_type __c = traits_type::eof(); 4133227825Stheraven if (this->gptr() == this->egptr()) 4134227825Stheraven { 4135227825Stheraven memmove(this->eback(), this->egptr() - __unget_sz, __unget_sz * sizeof(char_type)); 4136227825Stheraven if (__always_noconv_) 4137227825Stheraven { 4138227825Stheraven streamsize __nmemb = static_cast<streamsize>(this->egptr() - this->eback() - __unget_sz); 4139227825Stheraven __nmemb = __bufptr_->sgetn((char*)this->eback() + __unget_sz, __nmemb); 4140227825Stheraven if (__nmemb != 0) 4141227825Stheraven { 4142227825Stheraven this->setg(this->eback(), 4143227825Stheraven this->eback() + __unget_sz, 4144227825Stheraven this->eback() + __unget_sz + __nmemb); 4145227825Stheraven __c = *this->gptr(); 4146227825Stheraven } 4147227825Stheraven } 4148227825Stheraven else 4149227825Stheraven { 4150227825Stheraven memmove(__extbuf_, __extbufnext_, __extbufend_ - __extbufnext_); 4151227825Stheraven __extbufnext_ = __extbuf_ + (__extbufend_ - __extbufnext_); 4152227825Stheraven __extbufend_ = __extbuf_ + (__extbuf_ == __extbuf_min_ ? sizeof(__extbuf_min_) : __ebs_); 4153227825Stheraven streamsize __nmemb = _VSTD::min(static_cast<streamsize>(this->egptr() - this->eback() - __unget_sz), 4154227825Stheraven static_cast<streamsize>(__extbufend_ - __extbufnext_)); 4155227825Stheraven codecvt_base::result __r; 4156227825Stheraven state_type __svs = __st_; 4157227825Stheraven streamsize __nr = __bufptr_->sgetn(const_cast<char*>(__extbufnext_), __nmemb); 4158227825Stheraven if (__nr != 0) 4159227825Stheraven { 4160227825Stheraven __extbufend_ = __extbufnext_ + __nr; 4161227825Stheraven char_type* __inext; 4162227825Stheraven __r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_, 4163227825Stheraven this->eback() + __unget_sz, 4164227825Stheraven this->egptr(), __inext); 4165227825Stheraven if (__r == codecvt_base::noconv) 4166227825Stheraven { 4167227825Stheraven this->setg((char_type*)__extbuf_, (char_type*)__extbuf_, (char_type*)__extbufend_); 4168227825Stheraven __c = *this->gptr(); 4169227825Stheraven } 4170227825Stheraven else if (__inext != this->eback() + __unget_sz) 4171227825Stheraven { 4172227825Stheraven this->setg(this->eback(), this->eback() + __unget_sz, __inext); 4173227825Stheraven __c = *this->gptr(); 4174227825Stheraven } 4175227825Stheraven } 4176227825Stheraven } 4177227825Stheraven } 4178227825Stheraven else 4179227825Stheraven __c = *this->gptr(); 4180227825Stheraven if (this->eback() == &__1buf) 4181227825Stheraven this->setg(0, 0, 0); 4182227825Stheraven return __c; 4183227825Stheraven} 4184227825Stheraven 4185227825Stheraventemplate <class _Codecvt, class _Elem, class _Tr> 4186227825Stheraventypename wbuffer_convert<_Codecvt, _Elem, _Tr>::int_type 4187227825Stheravenwbuffer_convert<_Codecvt, _Elem, _Tr>::pbackfail(int_type __c) 4188227825Stheraven{ 4189227825Stheraven if (__cv_ != 0 && __bufptr_ != 0 && this->eback() < this->gptr()) 4190227825Stheraven { 4191227825Stheraven if (traits_type::eq_int_type(__c, traits_type::eof())) 4192227825Stheraven { 4193227825Stheraven this->gbump(-1); 4194227825Stheraven return traits_type::not_eof(__c); 4195227825Stheraven } 4196227825Stheraven if (traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1])) 4197227825Stheraven { 4198227825Stheraven this->gbump(-1); 4199227825Stheraven *this->gptr() = traits_type::to_char_type(__c); 4200227825Stheraven return __c; 4201227825Stheraven } 4202227825Stheraven } 4203227825Stheraven return traits_type::eof(); 4204227825Stheraven} 4205227825Stheraven 4206227825Stheraventemplate <class _Codecvt, class _Elem, class _Tr> 4207227825Stheraventypename wbuffer_convert<_Codecvt, _Elem, _Tr>::int_type 4208227825Stheravenwbuffer_convert<_Codecvt, _Elem, _Tr>::overflow(int_type __c) 4209227825Stheraven{ 4210227825Stheraven if (__cv_ == 0 || __bufptr_ == 0) 4211227825Stheraven return traits_type::eof(); 4212227825Stheraven __write_mode(); 4213227825Stheraven char_type __1buf; 4214227825Stheraven char_type* __pb_save = this->pbase(); 4215227825Stheraven char_type* __epb_save = this->epptr(); 4216227825Stheraven if (!traits_type::eq_int_type(__c, traits_type::eof())) 4217227825Stheraven { 4218227825Stheraven if (this->pptr() == 0) 4219227825Stheraven this->setp(&__1buf, &__1buf+1); 4220227825Stheraven *this->pptr() = traits_type::to_char_type(__c); 4221227825Stheraven this->pbump(1); 4222227825Stheraven } 4223227825Stheraven if (this->pptr() != this->pbase()) 4224227825Stheraven { 4225227825Stheraven if (__always_noconv_) 4226227825Stheraven { 4227227825Stheraven streamsize __nmemb = static_cast<streamsize>(this->pptr() - this->pbase()); 4228227825Stheraven if (__bufptr_->sputn((const char*)this->pbase(), __nmemb) != __nmemb) 4229227825Stheraven return traits_type::eof(); 4230227825Stheraven } 4231227825Stheraven else 4232227825Stheraven { 4233227825Stheraven char* __extbe = __extbuf_; 4234227825Stheraven codecvt_base::result __r; 4235227825Stheraven do 4236227825Stheraven { 4237227825Stheraven const char_type* __e; 4238227825Stheraven __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e, 4239227825Stheraven __extbuf_, __extbuf_ + __ebs_, __extbe); 4240227825Stheraven if (__e == this->pbase()) 4241227825Stheraven return traits_type::eof(); 4242227825Stheraven if (__r == codecvt_base::noconv) 4243227825Stheraven { 4244227825Stheraven streamsize __nmemb = static_cast<size_t>(this->pptr() - this->pbase()); 4245227825Stheraven if (__bufptr_->sputn((const char*)this->pbase(), __nmemb) != __nmemb) 4246227825Stheraven return traits_type::eof(); 4247227825Stheraven } 4248227825Stheraven else if (__r == codecvt_base::ok || __r == codecvt_base::partial) 4249227825Stheraven { 4250227825Stheraven streamsize __nmemb = static_cast<size_t>(__extbe - __extbuf_); 4251227825Stheraven if (__bufptr_->sputn(__extbuf_, __nmemb) != __nmemb) 4252227825Stheraven return traits_type::eof(); 4253227825Stheraven if (__r == codecvt_base::partial) 4254227825Stheraven { 4255227825Stheraven this->setp((char_type*)__e, this->pptr()); 4256227825Stheraven this->pbump(this->epptr() - this->pbase()); 4257227825Stheraven } 4258227825Stheraven } 4259227825Stheraven else 4260227825Stheraven return traits_type::eof(); 4261227825Stheraven } while (__r == codecvt_base::partial); 4262227825Stheraven } 4263227825Stheraven this->setp(__pb_save, __epb_save); 4264227825Stheraven } 4265227825Stheraven return traits_type::not_eof(__c); 4266227825Stheraven} 4267227825Stheraven 4268227825Stheraventemplate <class _Codecvt, class _Elem, class _Tr> 4269227825Stheravenbasic_streambuf<_Elem, _Tr>* 4270227825Stheravenwbuffer_convert<_Codecvt, _Elem, _Tr>::setbuf(char_type* __s, streamsize __n) 4271227825Stheraven{ 4272227825Stheraven this->setg(0, 0, 0); 4273227825Stheraven this->setp(0, 0); 4274227825Stheraven if (__owns_eb_) 4275227825Stheraven delete [] __extbuf_; 4276227825Stheraven if (__owns_ib_) 4277227825Stheraven delete [] __intbuf_; 4278227825Stheraven __ebs_ = __n; 4279227825Stheraven if (__ebs_ > sizeof(__extbuf_min_)) 4280227825Stheraven { 4281227825Stheraven if (__always_noconv_ && __s) 4282227825Stheraven { 4283227825Stheraven __extbuf_ = (char*)__s; 4284227825Stheraven __owns_eb_ = false; 4285227825Stheraven } 4286227825Stheraven else 4287227825Stheraven { 4288227825Stheraven __extbuf_ = new char[__ebs_]; 4289227825Stheraven __owns_eb_ = true; 4290227825Stheraven } 4291227825Stheraven } 4292227825Stheraven else 4293227825Stheraven { 4294227825Stheraven __extbuf_ = __extbuf_min_; 4295227825Stheraven __ebs_ = sizeof(__extbuf_min_); 4296227825Stheraven __owns_eb_ = false; 4297227825Stheraven } 4298227825Stheraven if (!__always_noconv_) 4299227825Stheraven { 4300227825Stheraven __ibs_ = max<streamsize>(__n, sizeof(__extbuf_min_)); 4301227825Stheraven if (__s && __ibs_ >= sizeof(__extbuf_min_)) 4302227825Stheraven { 4303227825Stheraven __intbuf_ = __s; 4304227825Stheraven __owns_ib_ = false; 4305227825Stheraven } 4306227825Stheraven else 4307227825Stheraven { 4308227825Stheraven __intbuf_ = new char_type[__ibs_]; 4309227825Stheraven __owns_ib_ = true; 4310227825Stheraven } 4311227825Stheraven } 4312227825Stheraven else 4313227825Stheraven { 4314227825Stheraven __ibs_ = 0; 4315227825Stheraven __intbuf_ = 0; 4316227825Stheraven __owns_ib_ = false; 4317227825Stheraven } 4318227825Stheraven return this; 4319227825Stheraven} 4320227825Stheraven 4321227825Stheraventemplate <class _Codecvt, class _Elem, class _Tr> 4322227825Stheraventypename wbuffer_convert<_Codecvt, _Elem, _Tr>::pos_type 4323227825Stheravenwbuffer_convert<_Codecvt, _Elem, _Tr>::seekoff(off_type __off, ios_base::seekdir __way, 4324227825Stheraven ios_base::openmode __om) 4325227825Stheraven{ 4326227825Stheraven int __width = __cv_->encoding(); 4327227825Stheraven if (__cv_ == 0 || __bufptr_ == 0 || (__width <= 0 && __off != 0) || sync()) 4328227825Stheraven return pos_type(off_type(-1)); 4329227825Stheraven // __width > 0 || __off == 0 4330227825Stheraven switch (__way) 4331227825Stheraven { 4332227825Stheraven case ios_base::beg: 4333227825Stheraven break; 4334227825Stheraven case ios_base::cur: 4335227825Stheraven break; 4336227825Stheraven case ios_base::end: 4337227825Stheraven break; 4338227825Stheraven default: 4339227825Stheraven return pos_type(off_type(-1)); 4340227825Stheraven } 4341227825Stheraven pos_type __r = __bufptr_->pubseekoff(__width * __off, __way, __om); 4342227825Stheraven __r.state(__st_); 4343227825Stheraven return __r; 4344227825Stheraven} 4345227825Stheraven 4346227825Stheraventemplate <class _Codecvt, class _Elem, class _Tr> 4347227825Stheraventypename wbuffer_convert<_Codecvt, _Elem, _Tr>::pos_type 4348227825Stheravenwbuffer_convert<_Codecvt, _Elem, _Tr>::seekpos(pos_type __sp, ios_base::openmode __wch) 4349227825Stheraven{ 4350227825Stheraven if (__cv_ == 0 || __bufptr_ == 0 || sync()) 4351227825Stheraven return pos_type(off_type(-1)); 4352227825Stheraven if (__bufptr_->pubseekpos(__sp, __wch) == pos_type(off_type(-1))) 4353227825Stheraven return pos_type(off_type(-1)); 4354227825Stheraven return __sp; 4355227825Stheraven} 4356227825Stheraven 4357227825Stheraventemplate <class _Codecvt, class _Elem, class _Tr> 4358227825Stheravenint 4359227825Stheravenwbuffer_convert<_Codecvt, _Elem, _Tr>::sync() 4360227825Stheraven{ 4361227825Stheraven if (__cv_ == 0 || __bufptr_ == 0) 4362227825Stheraven return 0; 4363227825Stheraven if (__cm_ & ios_base::out) 4364227825Stheraven { 4365227825Stheraven if (this->pptr() != this->pbase()) 4366227825Stheraven if (overflow() == traits_type::eof()) 4367227825Stheraven return -1; 4368227825Stheraven codecvt_base::result __r; 4369227825Stheraven do 4370227825Stheraven { 4371227825Stheraven char* __extbe; 4372227825Stheraven __r = __cv_->unshift(__st_, __extbuf_, __extbuf_ + __ebs_, __extbe); 4373227825Stheraven streamsize __nmemb = static_cast<streamsize>(__extbe - __extbuf_); 4374227825Stheraven if (__bufptr_->sputn(__extbuf_, __nmemb) != __nmemb) 4375227825Stheraven return -1; 4376227825Stheraven } while (__r == codecvt_base::partial); 4377227825Stheraven if (__r == codecvt_base::error) 4378227825Stheraven return -1; 4379227825Stheraven if (__bufptr_->pubsync()) 4380227825Stheraven return -1; 4381227825Stheraven } 4382227825Stheraven else if (__cm_ & ios_base::in) 4383227825Stheraven { 4384227825Stheraven off_type __c; 4385227825Stheraven if (__always_noconv_) 4386227825Stheraven __c = this->egptr() - this->gptr(); 4387227825Stheraven else 4388227825Stheraven { 4389227825Stheraven int __width = __cv_->encoding(); 4390227825Stheraven __c = __extbufend_ - __extbufnext_; 4391227825Stheraven if (__width > 0) 4392227825Stheraven __c += __width * (this->egptr() - this->gptr()); 4393227825Stheraven else 4394227825Stheraven { 4395227825Stheraven if (this->gptr() != this->egptr()) 4396227825Stheraven { 4397227825Stheraven reverse(this->gptr(), this->egptr()); 4398227825Stheraven codecvt_base::result __r; 4399227825Stheraven const char_type* __e = this->gptr(); 4400227825Stheraven char* __extbe; 4401227825Stheraven do 4402227825Stheraven { 4403227825Stheraven __r = __cv_->out(__st_, __e, this->egptr(), __e, 4404227825Stheraven __extbuf_, __extbuf_ + __ebs_, __extbe); 4405227825Stheraven switch (__r) 4406227825Stheraven { 4407227825Stheraven case codecvt_base::noconv: 4408227825Stheraven __c += this->egptr() - this->gptr(); 4409227825Stheraven break; 4410227825Stheraven case codecvt_base::ok: 4411227825Stheraven case codecvt_base::partial: 4412227825Stheraven __c += __extbe - __extbuf_; 4413227825Stheraven break; 4414227825Stheraven default: 4415227825Stheraven return -1; 4416227825Stheraven } 4417227825Stheraven } while (__r == codecvt_base::partial); 4418227825Stheraven } 4419227825Stheraven } 4420227825Stheraven } 4421227825Stheraven if (__bufptr_->pubseekoff(-__c, ios_base::cur, __cm_) == pos_type(off_type(-1))) 4422227825Stheraven return -1; 4423227825Stheraven this->setg(0, 0, 0); 4424227825Stheraven __cm_ = 0; 4425227825Stheraven } 4426227825Stheraven return 0; 4427227825Stheraven} 4428227825Stheraven 4429227825Stheraventemplate <class _Codecvt, class _Elem, class _Tr> 4430227825Stheravenbool 4431227825Stheravenwbuffer_convert<_Codecvt, _Elem, _Tr>::__read_mode() 4432227825Stheraven{ 4433227825Stheraven if (!(__cm_ & ios_base::in)) 4434227825Stheraven { 4435227825Stheraven this->setp(0, 0); 4436227825Stheraven if (__always_noconv_) 4437227825Stheraven this->setg((char_type*)__extbuf_, 4438227825Stheraven (char_type*)__extbuf_ + __ebs_, 4439227825Stheraven (char_type*)__extbuf_ + __ebs_); 4440227825Stheraven else 4441227825Stheraven this->setg(__intbuf_, __intbuf_ + __ibs_, __intbuf_ + __ibs_); 4442227825Stheraven __cm_ = ios_base::in; 4443227825Stheraven return true; 4444227825Stheraven } 4445227825Stheraven return false; 4446227825Stheraven} 4447227825Stheraven 4448227825Stheraventemplate <class _Codecvt, class _Elem, class _Tr> 4449227825Stheravenvoid 4450227825Stheravenwbuffer_convert<_Codecvt, _Elem, _Tr>::__write_mode() 4451227825Stheraven{ 4452227825Stheraven if (!(__cm_ & ios_base::out)) 4453227825Stheraven { 4454227825Stheraven this->setg(0, 0, 0); 4455227825Stheraven if (__ebs_ > sizeof(__extbuf_min_)) 4456227825Stheraven { 4457227825Stheraven if (__always_noconv_) 4458227825Stheraven this->setp((char_type*)__extbuf_, 4459227825Stheraven (char_type*)__extbuf_ + (__ebs_ - 1)); 4460227825Stheraven else 4461227825Stheraven this->setp(__intbuf_, __intbuf_ + (__ibs_ - 1)); 4462227825Stheraven } 4463227825Stheraven else 4464227825Stheraven this->setp(0, 0); 4465227825Stheraven __cm_ = ios_base::out; 4466227825Stheraven } 4467227825Stheraven} 4468227825Stheraven 4469227825Stheraventemplate <class _Codecvt, class _Elem, class _Tr> 4470227825Stheravenwbuffer_convert<_Codecvt, _Elem, _Tr>* 4471227825Stheravenwbuffer_convert<_Codecvt, _Elem, _Tr>::__close() 4472227825Stheraven{ 4473227825Stheraven wbuffer_convert* __rt = 0; 4474227825Stheraven if (__cv_ != 0 && __bufptr_ != 0) 4475227825Stheraven { 4476227825Stheraven __rt = this; 4477227825Stheraven if ((__cm_ & ios_base::out) && sync()) 4478227825Stheraven __rt = 0; 4479227825Stheraven } 4480227825Stheraven return __rt; 4481227825Stheraven} 4482227825Stheraven 4483227825Stheraven_LIBCPP_END_NAMESPACE_STD 4484227825Stheraven 4485227825Stheraven#endif // _LIBCPP_LOCALE 4486