1 // Locale support -*- C++ -*- 2 3 // Copyright (C) 2007-2017 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 /** @file bits/locale_facets_nonio.h 26 * This is an internal header file, included by other library headers. 27 * Do not attempt to use it directly. @headername{locale} 28 */ 29 30 // 31 // ISO C++ 14882: 22.1 Locales 32 // 33 34 #ifndef _LOCALE_FACETS_NONIO_H 35 #define _LOCALE_FACETS_NONIO_H 1 36 37 #pragma GCC system_header 38 39 #include <ctime> // For struct tm 40 41 namespace std _GLIBCXX_VISIBILITY(default) 42 { 43 _GLIBCXX_BEGIN_NAMESPACE_VERSION 44 45 /** 46 * @brief Time format ordering data. 47 * @ingroup locales 48 * 49 * This class provides an enum representing different orderings of 50 * time: day, month, and year. 51 */ 52 class time_base 53 { 54 public: 55 enum dateorder { no_order, dmy, mdy, ymd, ydm }; 56 }; 57 58 template<typename _CharT> 59 struct __timepunct_cache : public locale::facet 60 { 61 // List of all known timezones, with GMT first. 62 static const _CharT* _S_timezones[14]; 63 64 const _CharT* _M_date_format; 65 const _CharT* _M_date_era_format; 66 const _CharT* _M_time_format; 67 const _CharT* _M_time_era_format; 68 const _CharT* _M_date_time_format; 69 const _CharT* _M_date_time_era_format; 70 const _CharT* _M_am; 71 const _CharT* _M_pm; 72 const _CharT* _M_am_pm_format; 73 74 // Day names, starting with "C"'s Sunday. 75 const _CharT* _M_day1; 76 const _CharT* _M_day2; 77 const _CharT* _M_day3; 78 const _CharT* _M_day4; 79 const _CharT* _M_day5; 80 const _CharT* _M_day6; 81 const _CharT* _M_day7; 82 83 // Abbreviated day names, starting with "C"'s Sun. 84 const _CharT* _M_aday1; 85 const _CharT* _M_aday2; 86 const _CharT* _M_aday3; 87 const _CharT* _M_aday4; 88 const _CharT* _M_aday5; 89 const _CharT* _M_aday6; 90 const _CharT* _M_aday7; 91 92 // Month names, starting with "C"'s January. 93 const _CharT* _M_month01; 94 const _CharT* _M_month02; 95 const _CharT* _M_month03; 96 const _CharT* _M_month04; 97 const _CharT* _M_month05; 98 const _CharT* _M_month06; 99 const _CharT* _M_month07; 100 const _CharT* _M_month08; 101 const _CharT* _M_month09; 102 const _CharT* _M_month10; 103 const _CharT* _M_month11; 104 const _CharT* _M_month12; 105 106 // Abbreviated month names, starting with "C"'s Jan. 107 const _CharT* _M_amonth01; 108 const _CharT* _M_amonth02; 109 const _CharT* _M_amonth03; 110 const _CharT* _M_amonth04; 111 const _CharT* _M_amonth05; 112 const _CharT* _M_amonth06; 113 const _CharT* _M_amonth07; 114 const _CharT* _M_amonth08; 115 const _CharT* _M_amonth09; 116 const _CharT* _M_amonth10; 117 const _CharT* _M_amonth11; 118 const _CharT* _M_amonth12; 119 120 bool _M_allocated; 121 122 __timepunct_cache(size_t __refs = 0) : facet(__refs), 123 _M_date_format(0), _M_date_era_format(0), _M_time_format(0), 124 _M_time_era_format(0), _M_date_time_format(0), 125 _M_date_time_era_format(0), _M_am(0), _M_pm(0), 126 _M_am_pm_format(0), _M_day1(0), _M_day2(0), _M_day3(0), 127 _M_day4(0), _M_day5(0), _M_day6(0), _M_day7(0), 128 _M_aday1(0), _M_aday2(0), _M_aday3(0), _M_aday4(0), 129 _M_aday5(0), _M_aday6(0), _M_aday7(0), _M_month01(0), 130 _M_month02(0), _M_month03(0), _M_month04(0), _M_month05(0), 131 _M_month06(0), _M_month07(0), _M_month08(0), _M_month09(0), 132 _M_month10(0), _M_month11(0), _M_month12(0), _M_amonth01(0), 133 _M_amonth02(0), _M_amonth03(0), _M_amonth04(0), 134 _M_amonth05(0), _M_amonth06(0), _M_amonth07(0), 135 _M_amonth08(0), _M_amonth09(0), _M_amonth10(0), 136 _M_amonth11(0), _M_amonth12(0), _M_allocated(false) 137 { } 138 139 ~__timepunct_cache(); 140 141 private: 142 __timepunct_cache& 143 operator=(const __timepunct_cache&); 144 145 explicit 146 __timepunct_cache(const __timepunct_cache&); 147 }; 148 149 template<typename _CharT> 150 __timepunct_cache<_CharT>::~__timepunct_cache() 151 { 152 if (_M_allocated) 153 { 154 // Unused. 155 } 156 } 157 158 // Specializations. 159 template<> 160 const char* 161 __timepunct_cache<char>::_S_timezones[14]; 162 163 #ifdef _GLIBCXX_USE_WCHAR_T 164 template<> 165 const wchar_t* 166 __timepunct_cache<wchar_t>::_S_timezones[14]; 167 #endif 168 169 // Generic. 170 template<typename _CharT> 171 const _CharT* __timepunct_cache<_CharT>::_S_timezones[14]; 172 173 template<typename _CharT> 174 class __timepunct : public locale::facet 175 { 176 public: 177 // Types: 178 typedef _CharT __char_type; 179 typedef __timepunct_cache<_CharT> __cache_type; 180 181 protected: 182 __cache_type* _M_data; 183 __c_locale _M_c_locale_timepunct; 184 const char* _M_name_timepunct; 185 186 public: 187 /// Numpunct facet id. 188 static locale::id id; 189 190 explicit 191 __timepunct(size_t __refs = 0); 192 193 explicit 194 __timepunct(__cache_type* __cache, size_t __refs = 0); 195 196 /** 197 * @brief Internal constructor. Not for general use. 198 * 199 * This is a constructor for use by the library itself to set up new 200 * locales. 201 * 202 * @param __cloc The C locale. 203 * @param __s The name of a locale. 204 * @param refs Passed to the base facet class. 205 */ 206 explicit 207 __timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0); 208 209 // FIXME: for error checking purposes _M_put should return the return 210 // value of strftime/wcsftime. 211 void 212 _M_put(_CharT* __s, size_t __maxlen, const _CharT* __format, 213 const tm* __tm) const throw (); 214 215 void 216 _M_date_formats(const _CharT** __date) const 217 { 218 // Always have default first. 219 __date[0] = _M_data->_M_date_format; 220 __date[1] = _M_data->_M_date_era_format; 221 } 222 223 void 224 _M_time_formats(const _CharT** __time) const 225 { 226 // Always have default first. 227 __time[0] = _M_data->_M_time_format; 228 __time[1] = _M_data->_M_time_era_format; 229 } 230 231 void 232 _M_date_time_formats(const _CharT** __dt) const 233 { 234 // Always have default first. 235 __dt[0] = _M_data->_M_date_time_format; 236 __dt[1] = _M_data->_M_date_time_era_format; 237 } 238 239 void 240 _M_am_pm_format(const _CharT* __ampm) const 241 { __ampm = _M_data->_M_am_pm_format; } 242 243 void 244 _M_am_pm(const _CharT** __ampm) const 245 { 246 __ampm[0] = _M_data->_M_am; 247 __ampm[1] = _M_data->_M_pm; 248 } 249 250 void 251 _M_days(const _CharT** __days) const 252 { 253 __days[0] = _M_data->_M_day1; 254 __days[1] = _M_data->_M_day2; 255 __days[2] = _M_data->_M_day3; 256 __days[3] = _M_data->_M_day4; 257 __days[4] = _M_data->_M_day5; 258 __days[5] = _M_data->_M_day6; 259 __days[6] = _M_data->_M_day7; 260 } 261 262 void 263 _M_days_abbreviated(const _CharT** __days) const 264 { 265 __days[0] = _M_data->_M_aday1; 266 __days[1] = _M_data->_M_aday2; 267 __days[2] = _M_data->_M_aday3; 268 __days[3] = _M_data->_M_aday4; 269 __days[4] = _M_data->_M_aday5; 270 __days[5] = _M_data->_M_aday6; 271 __days[6] = _M_data->_M_aday7; 272 } 273 274 void 275 _M_months(const _CharT** __months) const 276 { 277 __months[0] = _M_data->_M_month01; 278 __months[1] = _M_data->_M_month02; 279 __months[2] = _M_data->_M_month03; 280 __months[3] = _M_data->_M_month04; 281 __months[4] = _M_data->_M_month05; 282 __months[5] = _M_data->_M_month06; 283 __months[6] = _M_data->_M_month07; 284 __months[7] = _M_data->_M_month08; 285 __months[8] = _M_data->_M_month09; 286 __months[9] = _M_data->_M_month10; 287 __months[10] = _M_data->_M_month11; 288 __months[11] = _M_data->_M_month12; 289 } 290 291 void 292 _M_months_abbreviated(const _CharT** __months) const 293 { 294 __months[0] = _M_data->_M_amonth01; 295 __months[1] = _M_data->_M_amonth02; 296 __months[2] = _M_data->_M_amonth03; 297 __months[3] = _M_data->_M_amonth04; 298 __months[4] = _M_data->_M_amonth05; 299 __months[5] = _M_data->_M_amonth06; 300 __months[6] = _M_data->_M_amonth07; 301 __months[7] = _M_data->_M_amonth08; 302 __months[8] = _M_data->_M_amonth09; 303 __months[9] = _M_data->_M_amonth10; 304 __months[10] = _M_data->_M_amonth11; 305 __months[11] = _M_data->_M_amonth12; 306 } 307 308 protected: 309 virtual 310 ~__timepunct(); 311 312 // For use at construction time only. 313 void 314 _M_initialize_timepunct(__c_locale __cloc = 0); 315 }; 316 317 template<typename _CharT> 318 locale::id __timepunct<_CharT>::id; 319 320 // Specializations. 321 template<> 322 void 323 __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc); 324 325 template<> 326 void 327 __timepunct<char>::_M_put(char*, size_t, const char*, const tm*) const throw (); 328 329 #ifdef _GLIBCXX_USE_WCHAR_T 330 template<> 331 void 332 __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc); 333 334 template<> 335 void 336 __timepunct<wchar_t>::_M_put(wchar_t*, size_t, const wchar_t*, 337 const tm*) const throw (); 338 #endif 339 340 _GLIBCXX_END_NAMESPACE_VERSION 341 } // namespace 342 343 // Include host and configuration specific timepunct functions. 344 #include <bits/time_members.h> 345 346 namespace std _GLIBCXX_VISIBILITY(default) 347 { 348 _GLIBCXX_BEGIN_NAMESPACE_VERSION 349 350 _GLIBCXX_BEGIN_NAMESPACE_CXX11 351 352 /** 353 * @brief Primary class template time_get. 354 * @ingroup locales 355 * 356 * This facet encapsulates the code to parse and return a date or 357 * time from a string. It is used by the istream numeric 358 * extraction operators. 359 * 360 * The time_get template uses protected virtual functions to provide the 361 * actual results. The public accessors forward the call to the virtual 362 * functions. These virtual functions are hooks for developers to 363 * implement the behavior they require from the time_get facet. 364 */ 365 template<typename _CharT, typename _InIter> 366 class time_get : public locale::facet, public time_base 367 { 368 public: 369 // Types: 370 //@{ 371 /// Public typedefs 372 typedef _CharT char_type; 373 typedef _InIter iter_type; 374 //@} 375 376 /// Numpunct facet id. 377 static locale::id id; 378 379 /** 380 * @brief Constructor performs initialization. 381 * 382 * This is the constructor provided by the standard. 383 * 384 * @param __refs Passed to the base facet class. 385 */ 386 explicit 387 time_get(size_t __refs = 0) 388 : facet (__refs) { } 389 390 /** 391 * @brief Return preferred order of month, day, and year. 392 * 393 * This function returns an enum from time_base::dateorder giving the 394 * preferred ordering if the format @a x given to time_put::put() only 395 * uses month, day, and year. If the format @a x for the associated 396 * locale uses other fields, this function returns 397 * time_base::dateorder::noorder. 398 * 399 * NOTE: The library always returns noorder at the moment. 400 * 401 * @return A member of time_base::dateorder. 402 */ 403 dateorder 404 date_order() const 405 { return this->do_date_order(); } 406 407 /** 408 * @brief Parse input time string. 409 * 410 * This function parses a time according to the format @a X and puts the 411 * results into a user-supplied struct tm. The result is returned by 412 * calling time_get::do_get_time(). 413 * 414 * If there is a valid time string according to format @a X, @a tm will 415 * be filled in accordingly and the returned iterator will point to the 416 * first character beyond the time string. If an error occurs before 417 * the end, err |= ios_base::failbit. If parsing reads all the 418 * characters, err |= ios_base::eofbit. 419 * 420 * @param __beg Start of string to parse. 421 * @param __end End of string to parse. 422 * @param __io Source of the locale. 423 * @param __err Error flags to set. 424 * @param __tm Pointer to struct tm to fill in. 425 * @return Iterator to first char beyond time string. 426 */ 427 iter_type 428 get_time(iter_type __beg, iter_type __end, ios_base& __io, 429 ios_base::iostate& __err, tm* __tm) const 430 { return this->do_get_time(__beg, __end, __io, __err, __tm); } 431 432 /** 433 * @brief Parse input date string. 434 * 435 * This function parses a date according to the format @a x and puts the 436 * results into a user-supplied struct tm. The result is returned by 437 * calling time_get::do_get_date(). 438 * 439 * If there is a valid date string according to format @a x, @a tm will 440 * be filled in accordingly and the returned iterator will point to the 441 * first character beyond the date string. If an error occurs before 442 * the end, err |= ios_base::failbit. If parsing reads all the 443 * characters, err |= ios_base::eofbit. 444 * 445 * @param __beg Start of string to parse. 446 * @param __end End of string to parse. 447 * @param __io Source of the locale. 448 * @param __err Error flags to set. 449 * @param __tm Pointer to struct tm to fill in. 450 * @return Iterator to first char beyond date string. 451 */ 452 iter_type 453 get_date(iter_type __beg, iter_type __end, ios_base& __io, 454 ios_base::iostate& __err, tm* __tm) const 455 { return this->do_get_date(__beg, __end, __io, __err, __tm); } 456 457 /** 458 * @brief Parse input weekday string. 459 * 460 * This function parses a weekday name and puts the results into a 461 * user-supplied struct tm. The result is returned by calling 462 * time_get::do_get_weekday(). 463 * 464 * Parsing starts by parsing an abbreviated weekday name. If a valid 465 * abbreviation is followed by a character that would lead to the full 466 * weekday name, parsing continues until the full name is found or an 467 * error occurs. Otherwise parsing finishes at the end of the 468 * abbreviated name. 469 * 470 * If an error occurs before the end, err |= ios_base::failbit. If 471 * parsing reads all the characters, err |= ios_base::eofbit. 472 * 473 * @param __beg Start of string to parse. 474 * @param __end End of string to parse. 475 * @param __io Source of the locale. 476 * @param __err Error flags to set. 477 * @param __tm Pointer to struct tm to fill in. 478 * @return Iterator to first char beyond weekday name. 479 */ 480 iter_type 481 get_weekday(iter_type __beg, iter_type __end, ios_base& __io, 482 ios_base::iostate& __err, tm* __tm) const 483 { return this->do_get_weekday(__beg, __end, __io, __err, __tm); } 484 485 /** 486 * @brief Parse input month string. 487 * 488 * This function parses a month name and puts the results into a 489 * user-supplied struct tm. The result is returned by calling 490 * time_get::do_get_monthname(). 491 * 492 * Parsing starts by parsing an abbreviated month name. If a valid 493 * abbreviation is followed by a character that would lead to the full 494 * month name, parsing continues until the full name is found or an 495 * error occurs. Otherwise parsing finishes at the end of the 496 * abbreviated name. 497 * 498 * If an error occurs before the end, err |= ios_base::failbit. If 499 * parsing reads all the characters, err |= 500 * ios_base::eofbit. 501 * 502 * @param __beg Start of string to parse. 503 * @param __end End of string to parse. 504 * @param __io Source of the locale. 505 * @param __err Error flags to set. 506 * @param __tm Pointer to struct tm to fill in. 507 * @return Iterator to first char beyond month name. 508 */ 509 iter_type 510 get_monthname(iter_type __beg, iter_type __end, ios_base& __io, 511 ios_base::iostate& __err, tm* __tm) const 512 { return this->do_get_monthname(__beg, __end, __io, __err, __tm); } 513 514 /** 515 * @brief Parse input year string. 516 * 517 * This function reads up to 4 characters to parse a year string and 518 * puts the results into a user-supplied struct tm. The result is 519 * returned by calling time_get::do_get_year(). 520 * 521 * 4 consecutive digits are interpreted as a full year. If there are 522 * exactly 2 consecutive digits, the library interprets this as the 523 * number of years since 1900. 524 * 525 * If an error occurs before the end, err |= ios_base::failbit. If 526 * parsing reads all the characters, err |= ios_base::eofbit. 527 * 528 * @param __beg Start of string to parse. 529 * @param __end End of string to parse. 530 * @param __io Source of the locale. 531 * @param __err Error flags to set. 532 * @param __tm Pointer to struct tm to fill in. 533 * @return Iterator to first char beyond year. 534 */ 535 iter_type 536 get_year(iter_type __beg, iter_type __end, ios_base& __io, 537 ios_base::iostate& __err, tm* __tm) const 538 { return this->do_get_year(__beg, __end, __io, __err, __tm); } 539 540 #if __cplusplus >= 201103L 541 /** 542 * @brief Parse input string according to format. 543 * 544 * This function calls time_get::do_get with the provided 545 * parameters. @see do_get() and get(). 546 * 547 * @param __s Start of string to parse. 548 * @param __end End of string to parse. 549 * @param __io Source of the locale. 550 * @param __err Error flags to set. 551 * @param __tm Pointer to struct tm to fill in. 552 * @param __format Format specifier. 553 * @param __modifier Format modifier. 554 * @return Iterator to first char not parsed. 555 */ 556 inline 557 iter_type get(iter_type __s, iter_type __end, ios_base& __io, 558 ios_base::iostate& __err, tm* __tm, char __format, 559 char __modifier = 0) const 560 { 561 return this->do_get(__s, __end, __io, __err, __tm, __format, 562 __modifier); 563 } 564 565 /** 566 * @brief Parse input string according to format. 567 * 568 * This function parses the input string according to a 569 * provided format string. It does the inverse of 570 * time_put::put. The format string follows the format 571 * specified for strftime(3)/strptime(3). The actual parsing 572 * is done by time_get::do_get. 573 * 574 * @param __s Start of string to parse. 575 * @param __end End of string to parse. 576 * @param __io Source of the locale. 577 * @param __err Error flags to set. 578 * @param __tm Pointer to struct tm to fill in. 579 * @param __fmt Start of the format string. 580 * @param __fmtend End of the format string. 581 * @return Iterator to first char not parsed. 582 */ 583 iter_type get(iter_type __s, iter_type __end, ios_base& __io, 584 ios_base::iostate& __err, tm* __tm, const char_type* __fmt, 585 const char_type* __fmtend) const; 586 #endif // __cplusplus >= 201103L 587 588 protected: 589 /// Destructor. 590 virtual 591 ~time_get() { } 592 593 /** 594 * @brief Return preferred order of month, day, and year. 595 * 596 * This function returns an enum from time_base::dateorder giving the 597 * preferred ordering if the format @a x given to time_put::put() only 598 * uses month, day, and year. This function is a hook for derived 599 * classes to change the value returned. 600 * 601 * @return A member of time_base::dateorder. 602 */ 603 virtual dateorder 604 do_date_order() const; 605 606 /** 607 * @brief Parse input time string. 608 * 609 * This function parses a time according to the format @a x and puts the 610 * results into a user-supplied struct tm. This function is a hook for 611 * derived classes to change the value returned. @see get_time() for 612 * details. 613 * 614 * @param __beg Start of string to parse. 615 * @param __end End of string to parse. 616 * @param __io Source of the locale. 617 * @param __err Error flags to set. 618 * @param __tm Pointer to struct tm to fill in. 619 * @return Iterator to first char beyond time string. 620 */ 621 virtual iter_type 622 do_get_time(iter_type __beg, iter_type __end, ios_base& __io, 623 ios_base::iostate& __err, tm* __tm) const; 624 625 /** 626 * @brief Parse input date string. 627 * 628 * This function parses a date according to the format @a X and puts the 629 * results into a user-supplied struct tm. This function is a hook for 630 * derived classes to change the value returned. @see get_date() for 631 * details. 632 * 633 * @param __beg Start of string to parse. 634 * @param __end End of string to parse. 635 * @param __io Source of the locale. 636 * @param __err Error flags to set. 637 * @param __tm Pointer to struct tm to fill in. 638 * @return Iterator to first char beyond date string. 639 */ 640 virtual iter_type 641 do_get_date(iter_type __beg, iter_type __end, ios_base& __io, 642 ios_base::iostate& __err, tm* __tm) const; 643 644 /** 645 * @brief Parse input weekday string. 646 * 647 * This function parses a weekday name and puts the results into a 648 * user-supplied struct tm. This function is a hook for derived 649 * classes to change the value returned. @see get_weekday() for 650 * details. 651 * 652 * @param __beg Start of string to parse. 653 * @param __end End of string to parse. 654 * @param __io Source of the locale. 655 * @param __err Error flags to set. 656 * @param __tm Pointer to struct tm to fill in. 657 * @return Iterator to first char beyond weekday name. 658 */ 659 virtual iter_type 660 do_get_weekday(iter_type __beg, iter_type __end, ios_base&, 661 ios_base::iostate& __err, tm* __tm) const; 662 663 /** 664 * @brief Parse input month string. 665 * 666 * This function parses a month name and puts the results into a 667 * user-supplied struct tm. This function is a hook for derived 668 * classes to change the value returned. @see get_monthname() for 669 * details. 670 * 671 * @param __beg Start of string to parse. 672 * @param __end End of string to parse. 673 * @param __io Source of the locale. 674 * @param __err Error flags to set. 675 * @param __tm Pointer to struct tm to fill in. 676 * @return Iterator to first char beyond month name. 677 */ 678 virtual iter_type 679 do_get_monthname(iter_type __beg, iter_type __end, ios_base&, 680 ios_base::iostate& __err, tm* __tm) const; 681 682 /** 683 * @brief Parse input year string. 684 * 685 * This function reads up to 4 characters to parse a year string and 686 * puts the results into a user-supplied struct tm. This function is a 687 * hook for derived classes to change the value returned. @see 688 * get_year() for details. 689 * 690 * @param __beg Start of string to parse. 691 * @param __end End of string to parse. 692 * @param __io Source of the locale. 693 * @param __err Error flags to set. 694 * @param __tm Pointer to struct tm to fill in. 695 * @return Iterator to first char beyond year. 696 */ 697 virtual iter_type 698 do_get_year(iter_type __beg, iter_type __end, ios_base& __io, 699 ios_base::iostate& __err, tm* __tm) const; 700 701 #if __cplusplus >= 201103L 702 /** 703 * @brief Parse input string according to format. 704 * 705 * This function parses the string according to the provided 706 * format and optional modifier. This function is a hook for 707 * derived classes to change the value returned. @see get() 708 * for more details. 709 * 710 * @param __s Start of string to parse. 711 * @param __end End of string to parse. 712 * @param __f Source of the locale. 713 * @param __err Error flags to set. 714 * @param __tm Pointer to struct tm to fill in. 715 * @param __format Format specifier. 716 * @param __modifier Format modifier. 717 * @return Iterator to first char not parsed. 718 */ 719 #if _GLIBCXX_USE_CXX11_ABI 720 virtual 721 #endif 722 iter_type 723 do_get(iter_type __s, iter_type __end, ios_base& __f, 724 ios_base::iostate& __err, tm* __tm, 725 char __format, char __modifier) const; 726 #endif // __cplusplus >= 201103L 727 728 // Extract numeric component of length __len. 729 iter_type 730 _M_extract_num(iter_type __beg, iter_type __end, int& __member, 731 int __min, int __max, size_t __len, 732 ios_base& __io, ios_base::iostate& __err) const; 733 734 // Extract any unique array of string literals in a const _CharT* array. 735 iter_type 736 _M_extract_name(iter_type __beg, iter_type __end, int& __member, 737 const _CharT** __names, size_t __indexlen, 738 ios_base& __io, ios_base::iostate& __err) const; 739 740 // Extract day or month name in a const _CharT* array. 741 iter_type 742 _M_extract_wday_or_month(iter_type __beg, iter_type __end, int& __member, 743 const _CharT** __names, size_t __indexlen, 744 ios_base& __io, ios_base::iostate& __err) const; 745 746 // Extract on a component-by-component basis, via __format argument. 747 iter_type 748 _M_extract_via_format(iter_type __beg, iter_type __end, ios_base& __io, 749 ios_base::iostate& __err, tm* __tm, 750 const _CharT* __format) const; 751 }; 752 753 template<typename _CharT, typename _InIter> 754 locale::id time_get<_CharT, _InIter>::id; 755 756 /// class time_get_byname [22.2.5.2]. 757 template<typename _CharT, typename _InIter> 758 class time_get_byname : public time_get<_CharT, _InIter> 759 { 760 public: 761 // Types: 762 typedef _CharT char_type; 763 typedef _InIter iter_type; 764 765 explicit 766 time_get_byname(const char*, size_t __refs = 0) 767 : time_get<_CharT, _InIter>(__refs) { } 768 769 #if __cplusplus >= 201103L 770 explicit 771 time_get_byname(const string& __s, size_t __refs = 0) 772 : time_get_byname(__s.c_str(), __refs) { } 773 #endif 774 775 protected: 776 virtual 777 ~time_get_byname() { } 778 }; 779 780 _GLIBCXX_END_NAMESPACE_CXX11 781 782 /** 783 * @brief Primary class template time_put. 784 * @ingroup locales 785 * 786 * This facet encapsulates the code to format and output dates and times 787 * according to formats used by strftime(). 788 * 789 * The time_put template uses protected virtual functions to provide the 790 * actual results. The public accessors forward the call to the virtual 791 * functions. These virtual functions are hooks for developers to 792 * implement the behavior they require from the time_put facet. 793 */ 794 template<typename _CharT, typename _OutIter> 795 class time_put : public locale::facet 796 { 797 public: 798 // Types: 799 //@{ 800 /// Public typedefs 801 typedef _CharT char_type; 802 typedef _OutIter iter_type; 803 //@} 804 805 /// Numpunct facet id. 806 static locale::id id; 807 808 /** 809 * @brief Constructor performs initialization. 810 * 811 * This is the constructor provided by the standard. 812 * 813 * @param __refs Passed to the base facet class. 814 */ 815 explicit 816 time_put(size_t __refs = 0) 817 : facet(__refs) { } 818 819 /** 820 * @brief Format and output a time or date. 821 * 822 * This function formats the data in struct tm according to the 823 * provided format string. The format string is interpreted as by 824 * strftime(). 825 * 826 * @param __s The stream to write to. 827 * @param __io Source of locale. 828 * @param __fill char_type to use for padding. 829 * @param __tm Struct tm with date and time info to format. 830 * @param __beg Start of format string. 831 * @param __end End of format string. 832 * @return Iterator after writing. 833 */ 834 iter_type 835 put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm, 836 const _CharT* __beg, const _CharT* __end) const; 837 838 /** 839 * @brief Format and output a time or date. 840 * 841 * This function formats the data in struct tm according to the 842 * provided format char and optional modifier. The format and modifier 843 * are interpreted as by strftime(). It does so by returning 844 * time_put::do_put(). 845 * 846 * @param __s The stream to write to. 847 * @param __io Source of locale. 848 * @param __fill char_type to use for padding. 849 * @param __tm Struct tm with date and time info to format. 850 * @param __format Format char. 851 * @param __mod Optional modifier char. 852 * @return Iterator after writing. 853 */ 854 iter_type 855 put(iter_type __s, ios_base& __io, char_type __fill, 856 const tm* __tm, char __format, char __mod = 0) const 857 { return this->do_put(__s, __io, __fill, __tm, __format, __mod); } 858 859 protected: 860 /// Destructor. 861 virtual 862 ~time_put() 863 { } 864 865 /** 866 * @brief Format and output a time or date. 867 * 868 * This function formats the data in struct tm according to the 869 * provided format char and optional modifier. This function is a hook 870 * for derived classes to change the value returned. @see put() for 871 * more details. 872 * 873 * @param __s The stream to write to. 874 * @param __io Source of locale. 875 * @param __fill char_type to use for padding. 876 * @param __tm Struct tm with date and time info to format. 877 * @param __format Format char. 878 * @param __mod Optional modifier char. 879 * @return Iterator after writing. 880 */ 881 virtual iter_type 882 do_put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm, 883 char __format, char __mod) const; 884 }; 885 886 template<typename _CharT, typename _OutIter> 887 locale::id time_put<_CharT, _OutIter>::id; 888 889 /// class time_put_byname [22.2.5.4]. 890 template<typename _CharT, typename _OutIter> 891 class time_put_byname : public time_put<_CharT, _OutIter> 892 { 893 public: 894 // Types: 895 typedef _CharT char_type; 896 typedef _OutIter iter_type; 897 898 explicit 899 time_put_byname(const char*, size_t __refs = 0) 900 : time_put<_CharT, _OutIter>(__refs) 901 { }; 902 903 #if __cplusplus >= 201103L 904 explicit 905 time_put_byname(const string& __s, size_t __refs = 0) 906 : time_put_byname(__s.c_str(), __refs) { } 907 #endif 908 909 protected: 910 virtual 911 ~time_put_byname() { } 912 }; 913 914 915 /** 916 * @brief Money format ordering data. 917 * @ingroup locales 918 * 919 * This class contains an ordered array of 4 fields to represent the 920 * pattern for formatting a money amount. Each field may contain one entry 921 * from the part enum. symbol, sign, and value must be present and the 922 * remaining field must contain either none or space. @see 923 * moneypunct::pos_format() and moneypunct::neg_format() for details of how 924 * these fields are interpreted. 925 */ 926 class money_base 927 { 928 public: 929 enum part { none, space, symbol, sign, value }; 930 struct pattern { char field[4]; }; 931 932 static const pattern _S_default_pattern; 933 934 enum 935 { 936 _S_minus, 937 _S_zero, 938 _S_end = 11 939 }; 940 941 // String literal of acceptable (narrow) input/output, for 942 // money_get/money_put. "-0123456789" 943 static const char* _S_atoms; 944 945 // Construct and return valid pattern consisting of some combination of: 946 // space none symbol sign value 947 _GLIBCXX_CONST static pattern 948 _S_construct_pattern(char __precedes, char __space, char __posn) throw (); 949 }; 950 951 template<typename _CharT, bool _Intl> 952 struct __moneypunct_cache : public locale::facet 953 { 954 const char* _M_grouping; 955 size_t _M_grouping_size; 956 bool _M_use_grouping; 957 _CharT _M_decimal_point; 958 _CharT _M_thousands_sep; 959 const _CharT* _M_curr_symbol; 960 size_t _M_curr_symbol_size; 961 const _CharT* _M_positive_sign; 962 size_t _M_positive_sign_size; 963 const _CharT* _M_negative_sign; 964 size_t _M_negative_sign_size; 965 int _M_frac_digits; 966 money_base::pattern _M_pos_format; 967 money_base::pattern _M_neg_format; 968 969 // A list of valid numeric literals for input and output: in the standard 970 // "C" locale, this is "-0123456789". This array contains the chars after 971 // having been passed through the current locale's ctype<_CharT>.widen(). 972 _CharT _M_atoms[money_base::_S_end]; 973 974 bool _M_allocated; 975 976 __moneypunct_cache(size_t __refs = 0) : facet(__refs), 977 _M_grouping(0), _M_grouping_size(0), _M_use_grouping(false), 978 _M_decimal_point(_CharT()), _M_thousands_sep(_CharT()), 979 _M_curr_symbol(0), _M_curr_symbol_size(0), 980 _M_positive_sign(0), _M_positive_sign_size(0), 981 _M_negative_sign(0), _M_negative_sign_size(0), 982 _M_frac_digits(0), 983 _M_pos_format(money_base::pattern()), 984 _M_neg_format(money_base::pattern()), _M_allocated(false) 985 { } 986 987 ~__moneypunct_cache(); 988 989 void 990 _M_cache(const locale& __loc); 991 992 private: 993 __moneypunct_cache& 994 operator=(const __moneypunct_cache&); 995 996 explicit 997 __moneypunct_cache(const __moneypunct_cache&); 998 }; 999 1000 template<typename _CharT, bool _Intl> 1001 __moneypunct_cache<_CharT, _Intl>::~__moneypunct_cache() 1002 { 1003 if (_M_allocated) 1004 { 1005 delete [] _M_grouping; 1006 delete [] _M_curr_symbol; 1007 delete [] _M_positive_sign; 1008 delete [] _M_negative_sign; 1009 } 1010 } 1011 1012 _GLIBCXX_BEGIN_NAMESPACE_CXX11 1013 1014 /** 1015 * @brief Primary class template moneypunct. 1016 * @ingroup locales 1017 * 1018 * This facet encapsulates the punctuation, grouping and other formatting 1019 * features of money amount string representations. 1020 */ 1021 template<typename _CharT, bool _Intl> 1022 class moneypunct : public locale::facet, public money_base 1023 { 1024 public: 1025 // Types: 1026 //@{ 1027 /// Public typedefs 1028 typedef _CharT char_type; 1029 typedef basic_string<_CharT> string_type; 1030 //@} 1031 typedef __moneypunct_cache<_CharT, _Intl> __cache_type; 1032 1033 private: 1034 __cache_type* _M_data; 1035 1036 public: 1037 /// This value is provided by the standard, but no reason for its 1038 /// existence. 1039 static const bool intl = _Intl; 1040 /// Numpunct facet id. 1041 static locale::id id; 1042 1043 /** 1044 * @brief Constructor performs initialization. 1045 * 1046 * This is the constructor provided by the standard. 1047 * 1048 * @param __refs Passed to the base facet class. 1049 */ 1050 explicit 1051 moneypunct(size_t __refs = 0) 1052 : facet(__refs), _M_data(0) 1053 { _M_initialize_moneypunct(); } 1054 1055 /** 1056 * @brief Constructor performs initialization. 1057 * 1058 * This is an internal constructor. 1059 * 1060 * @param __cache Cache for optimization. 1061 * @param __refs Passed to the base facet class. 1062 */ 1063 explicit 1064 moneypunct(__cache_type* __cache, size_t __refs = 0) 1065 : facet(__refs), _M_data(__cache) 1066 { _M_initialize_moneypunct(); } 1067 1068 /** 1069 * @brief Internal constructor. Not for general use. 1070 * 1071 * This is a constructor for use by the library itself to set up new 1072 * locales. 1073 * 1074 * @param __cloc The C locale. 1075 * @param __s The name of a locale. 1076 * @param __refs Passed to the base facet class. 1077 */ 1078 explicit 1079 moneypunct(__c_locale __cloc, const char* __s, size_t __refs = 0) 1080 : facet(__refs), _M_data(0) 1081 { _M_initialize_moneypunct(__cloc, __s); } 1082 1083 /** 1084 * @brief Return decimal point character. 1085 * 1086 * This function returns a char_type to use as a decimal point. It 1087 * does so by returning returning 1088 * moneypunct<char_type>::do_decimal_point(). 1089 * 1090 * @return @a char_type representing a decimal point. 1091 */ 1092 char_type 1093 decimal_point() const 1094 { return this->do_decimal_point(); } 1095 1096 /** 1097 * @brief Return thousands separator character. 1098 * 1099 * This function returns a char_type to use as a thousands 1100 * separator. It does so by returning returning 1101 * moneypunct<char_type>::do_thousands_sep(). 1102 * 1103 * @return char_type representing a thousands separator. 1104 */ 1105 char_type 1106 thousands_sep() const 1107 { return this->do_thousands_sep(); } 1108 1109 /** 1110 * @brief Return grouping specification. 1111 * 1112 * This function returns a string representing groupings for the 1113 * integer part of an amount. Groupings indicate where thousands 1114 * separators should be inserted. 1115 * 1116 * Each char in the return string is interpret as an integer rather 1117 * than a character. These numbers represent the number of digits in a 1118 * group. The first char in the string represents the number of digits 1119 * in the least significant group. If a char is negative, it indicates 1120 * an unlimited number of digits for the group. If more chars from the 1121 * string are required to group a number, the last char is used 1122 * repeatedly. 1123 * 1124 * For example, if the grouping() returns <code>\003\002</code> 1125 * and is applied to the number 123456789, this corresponds to 1126 * 12,34,56,789. Note that if the string was <code>32</code>, this would 1127 * put more than 50 digits into the least significant group if 1128 * the character set is ASCII. 1129 * 1130 * The string is returned by calling 1131 * moneypunct<char_type>::do_grouping(). 1132 * 1133 * @return string representing grouping specification. 1134 */ 1135 string 1136 grouping() const 1137 { return this->do_grouping(); } 1138 1139 /** 1140 * @brief Return currency symbol string. 1141 * 1142 * This function returns a string_type to use as a currency symbol. It 1143 * does so by returning returning 1144 * moneypunct<char_type>::do_curr_symbol(). 1145 * 1146 * @return @a string_type representing a currency symbol. 1147 */ 1148 string_type 1149 curr_symbol() const 1150 { return this->do_curr_symbol(); } 1151 1152 /** 1153 * @brief Return positive sign string. 1154 * 1155 * This function returns a string_type to use as a sign for positive 1156 * amounts. It does so by returning returning 1157 * moneypunct<char_type>::do_positive_sign(). 1158 * 1159 * If the return value contains more than one character, the first 1160 * character appears in the position indicated by pos_format() and the 1161 * remainder appear at the end of the formatted string. 1162 * 1163 * @return @a string_type representing a positive sign. 1164 */ 1165 string_type 1166 positive_sign() const 1167 { return this->do_positive_sign(); } 1168 1169 /** 1170 * @brief Return negative sign string. 1171 * 1172 * This function returns a string_type to use as a sign for negative 1173 * amounts. It does so by returning returning 1174 * moneypunct<char_type>::do_negative_sign(). 1175 * 1176 * If the return value contains more than one character, the first 1177 * character appears in the position indicated by neg_format() and the 1178 * remainder appear at the end of the formatted string. 1179 * 1180 * @return @a string_type representing a negative sign. 1181 */ 1182 string_type 1183 negative_sign() const 1184 { return this->do_negative_sign(); } 1185 1186 /** 1187 * @brief Return number of digits in fraction. 1188 * 1189 * This function returns the exact number of digits that make up the 1190 * fractional part of a money amount. It does so by returning 1191 * returning moneypunct<char_type>::do_frac_digits(). 1192 * 1193 * The fractional part of a money amount is optional. But if it is 1194 * present, there must be frac_digits() digits. 1195 * 1196 * @return Number of digits in amount fraction. 1197 */ 1198 int 1199 frac_digits() const 1200 { return this->do_frac_digits(); } 1201 1202 //@{ 1203 /** 1204 * @brief Return pattern for money values. 1205 * 1206 * This function returns a pattern describing the formatting of a 1207 * positive or negative valued money amount. It does so by returning 1208 * returning moneypunct<char_type>::do_pos_format() or 1209 * moneypunct<char_type>::do_neg_format(). 1210 * 1211 * The pattern has 4 fields describing the ordering of symbol, sign, 1212 * value, and none or space. There must be one of each in the pattern. 1213 * The none and space enums may not appear in the first field and space 1214 * may not appear in the final field. 1215 * 1216 * The parts of a money string must appear in the order indicated by 1217 * the fields of the pattern. The symbol field indicates that the 1218 * value of curr_symbol() may be present. The sign field indicates 1219 * that the value of positive_sign() or negative_sign() must be 1220 * present. The value field indicates that the absolute value of the 1221 * money amount is present. none indicates 0 or more whitespace 1222 * characters, except at the end, where it permits no whitespace. 1223 * space indicates that 1 or more whitespace characters must be 1224 * present. 1225 * 1226 * For example, for the US locale and pos_format() pattern 1227 * {symbol,sign,value,none}, curr_symbol() == '$' 1228 * positive_sign() == '+', and value 10.01, and 1229 * options set to force the symbol, the corresponding string is 1230 * <code>$+10.01</code>. 1231 * 1232 * @return Pattern for money values. 1233 */ 1234 pattern 1235 pos_format() const 1236 { return this->do_pos_format(); } 1237 1238 pattern 1239 neg_format() const 1240 { return this->do_neg_format(); } 1241 //@} 1242 1243 protected: 1244 /// Destructor. 1245 virtual 1246 ~moneypunct(); 1247 1248 /** 1249 * @brief Return decimal point character. 1250 * 1251 * Returns a char_type to use as a decimal point. This function is a 1252 * hook for derived classes to change the value returned. 1253 * 1254 * @return @a char_type representing a decimal point. 1255 */ 1256 virtual char_type 1257 do_decimal_point() const 1258 { return _M_data->_M_decimal_point; } 1259 1260 /** 1261 * @brief Return thousands separator character. 1262 * 1263 * Returns a char_type to use as a thousands separator. This function 1264 * is a hook for derived classes to change the value returned. 1265 * 1266 * @return @a char_type representing a thousands separator. 1267 */ 1268 virtual char_type 1269 do_thousands_sep() const 1270 { return _M_data->_M_thousands_sep; } 1271 1272 /** 1273 * @brief Return grouping specification. 1274 * 1275 * Returns a string representing groupings for the integer part of a 1276 * number. This function is a hook for derived classes to change the 1277 * value returned. @see grouping() for details. 1278 * 1279 * @return String representing grouping specification. 1280 */ 1281 virtual string 1282 do_grouping() const 1283 { return _M_data->_M_grouping; } 1284 1285 /** 1286 * @brief Return currency symbol string. 1287 * 1288 * This function returns a string_type to use as a currency symbol. 1289 * This function is a hook for derived classes to change the value 1290 * returned. @see curr_symbol() for details. 1291 * 1292 * @return @a string_type representing a currency symbol. 1293 */ 1294 virtual string_type 1295 do_curr_symbol() const 1296 { return _M_data->_M_curr_symbol; } 1297 1298 /** 1299 * @brief Return positive sign string. 1300 * 1301 * This function returns a string_type to use as a sign for positive 1302 * amounts. This function is a hook for derived classes to change the 1303 * value returned. @see positive_sign() for details. 1304 * 1305 * @return @a string_type representing a positive sign. 1306 */ 1307 virtual string_type 1308 do_positive_sign() const 1309 { return _M_data->_M_positive_sign; } 1310 1311 /** 1312 * @brief Return negative sign string. 1313 * 1314 * This function returns a string_type to use as a sign for negative 1315 * amounts. This function is a hook for derived classes to change the 1316 * value returned. @see negative_sign() for details. 1317 * 1318 * @return @a string_type representing a negative sign. 1319 */ 1320 virtual string_type 1321 do_negative_sign() const 1322 { return _M_data->_M_negative_sign; } 1323 1324 /** 1325 * @brief Return number of digits in fraction. 1326 * 1327 * This function returns the exact number of digits that make up the 1328 * fractional part of a money amount. This function is a hook for 1329 * derived classes to change the value returned. @see frac_digits() 1330 * for details. 1331 * 1332 * @return Number of digits in amount fraction. 1333 */ 1334 virtual int 1335 do_frac_digits() const 1336 { return _M_data->_M_frac_digits; } 1337 1338 /** 1339 * @brief Return pattern for money values. 1340 * 1341 * This function returns a pattern describing the formatting of a 1342 * positive valued money amount. This function is a hook for derived 1343 * classes to change the value returned. @see pos_format() for 1344 * details. 1345 * 1346 * @return Pattern for money values. 1347 */ 1348 virtual pattern 1349 do_pos_format() const 1350 { return _M_data->_M_pos_format; } 1351 1352 /** 1353 * @brief Return pattern for money values. 1354 * 1355 * This function returns a pattern describing the formatting of a 1356 * negative valued money amount. This function is a hook for derived 1357 * classes to change the value returned. @see neg_format() for 1358 * details. 1359 * 1360 * @return Pattern for money values. 1361 */ 1362 virtual pattern 1363 do_neg_format() const 1364 { return _M_data->_M_neg_format; } 1365 1366 // For use at construction time only. 1367 void 1368 _M_initialize_moneypunct(__c_locale __cloc = 0, 1369 const char* __name = 0); 1370 }; 1371 1372 template<typename _CharT, bool _Intl> 1373 locale::id moneypunct<_CharT, _Intl>::id; 1374 1375 template<typename _CharT, bool _Intl> 1376 const bool moneypunct<_CharT, _Intl>::intl; 1377 1378 template<> 1379 moneypunct<char, true>::~moneypunct(); 1380 1381 template<> 1382 moneypunct<char, false>::~moneypunct(); 1383 1384 template<> 1385 void 1386 moneypunct<char, true>::_M_initialize_moneypunct(__c_locale, const char*); 1387 1388 template<> 1389 void 1390 moneypunct<char, false>::_M_initialize_moneypunct(__c_locale, const char*); 1391 1392 #ifdef _GLIBCXX_USE_WCHAR_T 1393 template<> 1394 moneypunct<wchar_t, true>::~moneypunct(); 1395 1396 template<> 1397 moneypunct<wchar_t, false>::~moneypunct(); 1398 1399 template<> 1400 void 1401 moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale, 1402 const char*); 1403 1404 template<> 1405 void 1406 moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale, 1407 const char*); 1408 #endif 1409 1410 /// class moneypunct_byname [22.2.6.4]. 1411 template<typename _CharT, bool _Intl> 1412 class moneypunct_byname : public moneypunct<_CharT, _Intl> 1413 { 1414 public: 1415 typedef _CharT char_type; 1416 typedef basic_string<_CharT> string_type; 1417 1418 static const bool intl = _Intl; 1419 1420 explicit 1421 moneypunct_byname(const char* __s, size_t __refs = 0) 1422 : moneypunct<_CharT, _Intl>(__refs) 1423 { 1424 if (__builtin_strcmp(__s, "C") != 0 1425 && __builtin_strcmp(__s, "POSIX") != 0) 1426 { 1427 __c_locale __tmp; 1428 this->_S_create_c_locale(__tmp, __s); 1429 this->_M_initialize_moneypunct(__tmp); 1430 this->_S_destroy_c_locale(__tmp); 1431 } 1432 } 1433 1434 #if __cplusplus >= 201103L 1435 explicit 1436 moneypunct_byname(const string& __s, size_t __refs = 0) 1437 : moneypunct_byname(__s.c_str(), __refs) { } 1438 #endif 1439 1440 protected: 1441 virtual 1442 ~moneypunct_byname() { } 1443 }; 1444 1445 template<typename _CharT, bool _Intl> 1446 const bool moneypunct_byname<_CharT, _Intl>::intl; 1447 1448 _GLIBCXX_END_NAMESPACE_CXX11 1449 1450 _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11 1451 1452 /** 1453 * @brief Primary class template money_get. 1454 * @ingroup locales 1455 * 1456 * This facet encapsulates the code to parse and return a monetary 1457 * amount from a string. 1458 * 1459 * The money_get template uses protected virtual functions to 1460 * provide the actual results. The public accessors forward the 1461 * call to the virtual functions. These virtual functions are 1462 * hooks for developers to implement the behavior they require from 1463 * the money_get facet. 1464 */ 1465 template<typename _CharT, typename _InIter> 1466 class money_get : public locale::facet 1467 { 1468 public: 1469 // Types: 1470 //@{ 1471 /// Public typedefs 1472 typedef _CharT char_type; 1473 typedef _InIter iter_type; 1474 typedef basic_string<_CharT> string_type; 1475 //@} 1476 1477 /// Numpunct facet id. 1478 static locale::id id; 1479 1480 /** 1481 * @brief Constructor performs initialization. 1482 * 1483 * This is the constructor provided by the standard. 1484 * 1485 * @param __refs Passed to the base facet class. 1486 */ 1487 explicit 1488 money_get(size_t __refs = 0) : facet(__refs) { } 1489 1490 /** 1491 * @brief Read and parse a monetary value. 1492 * 1493 * This function reads characters from @a __s, interprets them as a 1494 * monetary value according to moneypunct and ctype facets retrieved 1495 * from io.getloc(), and returns the result in @a units as an integral 1496 * value moneypunct::frac_digits() * the actual amount. For example, 1497 * the string $10.01 in a US locale would store 1001 in @a units. 1498 * 1499 * Any characters not part of a valid money amount are not consumed. 1500 * 1501 * If a money value cannot be parsed from the input stream, sets 1502 * err=(err|io.failbit). If the stream is consumed before finishing 1503 * parsing, sets err=(err|io.failbit|io.eofbit). @a units is 1504 * unchanged if parsing fails. 1505 * 1506 * This function works by returning the result of do_get(). 1507 * 1508 * @param __s Start of characters to parse. 1509 * @param __end End of characters to parse. 1510 * @param __intl Parameter to use_facet<moneypunct<CharT,intl> >. 1511 * @param __io Source of facets and io state. 1512 * @param __err Error field to set if parsing fails. 1513 * @param __units Place to store result of parsing. 1514 * @return Iterator referencing first character beyond valid money 1515 * amount. 1516 */ 1517 iter_type 1518 get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 1519 ios_base::iostate& __err, long double& __units) const 1520 { return this->do_get(__s, __end, __intl, __io, __err, __units); } 1521 1522 /** 1523 * @brief Read and parse a monetary value. 1524 * 1525 * This function reads characters from @a __s, interprets them as 1526 * a monetary value according to moneypunct and ctype facets 1527 * retrieved from io.getloc(), and returns the result in @a 1528 * digits. For example, the string $10.01 in a US locale would 1529 * store <code>1001</code> in @a digits. 1530 * 1531 * Any characters not part of a valid money amount are not consumed. 1532 * 1533 * If a money value cannot be parsed from the input stream, sets 1534 * err=(err|io.failbit). If the stream is consumed before finishing 1535 * parsing, sets err=(err|io.failbit|io.eofbit). 1536 * 1537 * This function works by returning the result of do_get(). 1538 * 1539 * @param __s Start of characters to parse. 1540 * @param __end End of characters to parse. 1541 * @param __intl Parameter to use_facet<moneypunct<CharT,intl> >. 1542 * @param __io Source of facets and io state. 1543 * @param __err Error field to set if parsing fails. 1544 * @param __digits Place to store result of parsing. 1545 * @return Iterator referencing first character beyond valid money 1546 * amount. 1547 */ 1548 iter_type 1549 get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 1550 ios_base::iostate& __err, string_type& __digits) const 1551 { return this->do_get(__s, __end, __intl, __io, __err, __digits); } 1552 1553 protected: 1554 /// Destructor. 1555 virtual 1556 ~money_get() { } 1557 1558 /** 1559 * @brief Read and parse a monetary value. 1560 * 1561 * This function reads and parses characters representing a monetary 1562 * value. This function is a hook for derived classes to change the 1563 * value returned. @see get() for details. 1564 */ 1565 // XXX GLIBCXX_ABI Deprecated 1566 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \ 1567 && _GLIBCXX_USE_CXX11_ABI == 0 1568 virtual iter_type 1569 __do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 1570 ios_base::iostate& __err, double& __units) const; 1571 #else 1572 virtual iter_type 1573 do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 1574 ios_base::iostate& __err, long double& __units) const; 1575 #endif 1576 1577 /** 1578 * @brief Read and parse a monetary value. 1579 * 1580 * This function reads and parses characters representing a monetary 1581 * value. This function is a hook for derived classes to change the 1582 * value returned. @see get() for details. 1583 */ 1584 virtual iter_type 1585 do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 1586 ios_base::iostate& __err, string_type& __digits) const; 1587 1588 // XXX GLIBCXX_ABI Deprecated 1589 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \ 1590 && _GLIBCXX_USE_CXX11_ABI == 0 1591 virtual iter_type 1592 do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 1593 ios_base::iostate& __err, long double& __units) const; 1594 #endif 1595 1596 template<bool _Intl> 1597 iter_type 1598 _M_extract(iter_type __s, iter_type __end, ios_base& __io, 1599 ios_base::iostate& __err, string& __digits) const; 1600 }; 1601 1602 template<typename _CharT, typename _InIter> 1603 locale::id money_get<_CharT, _InIter>::id; 1604 1605 /** 1606 * @brief Primary class template money_put. 1607 * @ingroup locales 1608 * 1609 * This facet encapsulates the code to format and output a monetary 1610 * amount. 1611 * 1612 * The money_put template uses protected virtual functions to 1613 * provide the actual results. The public accessors forward the 1614 * call to the virtual functions. These virtual functions are 1615 * hooks for developers to implement the behavior they require from 1616 * the money_put facet. 1617 */ 1618 template<typename _CharT, typename _OutIter> 1619 class money_put : public locale::facet 1620 { 1621 public: 1622 //@{ 1623 /// Public typedefs 1624 typedef _CharT char_type; 1625 typedef _OutIter iter_type; 1626 typedef basic_string<_CharT> string_type; 1627 //@} 1628 1629 /// Numpunct facet id. 1630 static locale::id id; 1631 1632 /** 1633 * @brief Constructor performs initialization. 1634 * 1635 * This is the constructor provided by the standard. 1636 * 1637 * @param __refs Passed to the base facet class. 1638 */ 1639 explicit 1640 money_put(size_t __refs = 0) : facet(__refs) { } 1641 1642 /** 1643 * @brief Format and output a monetary value. 1644 * 1645 * This function formats @a units as a monetary value according to 1646 * moneypunct and ctype facets retrieved from io.getloc(), and writes 1647 * the resulting characters to @a __s. For example, the value 1001 in a 1648 * US locale would write <code>$10.01</code> to @a __s. 1649 * 1650 * This function works by returning the result of do_put(). 1651 * 1652 * @param __s The stream to write to. 1653 * @param __intl Parameter to use_facet<moneypunct<CharT,intl> >. 1654 * @param __io Source of facets and io state. 1655 * @param __fill char_type to use for padding. 1656 * @param __units Place to store result of parsing. 1657 * @return Iterator after writing. 1658 */ 1659 iter_type 1660 put(iter_type __s, bool __intl, ios_base& __io, 1661 char_type __fill, long double __units) const 1662 { return this->do_put(__s, __intl, __io, __fill, __units); } 1663 1664 /** 1665 * @brief Format and output a monetary value. 1666 * 1667 * This function formats @a digits as a monetary value 1668 * according to moneypunct and ctype facets retrieved from 1669 * io.getloc(), and writes the resulting characters to @a __s. 1670 * For example, the string <code>1001</code> in a US locale 1671 * would write <code>$10.01</code> to @a __s. 1672 * 1673 * This function works by returning the result of do_put(). 1674 * 1675 * @param __s The stream to write to. 1676 * @param __intl Parameter to use_facet<moneypunct<CharT,intl> >. 1677 * @param __io Source of facets and io state. 1678 * @param __fill char_type to use for padding. 1679 * @param __digits Place to store result of parsing. 1680 * @return Iterator after writing. 1681 */ 1682 iter_type 1683 put(iter_type __s, bool __intl, ios_base& __io, 1684 char_type __fill, const string_type& __digits) const 1685 { return this->do_put(__s, __intl, __io, __fill, __digits); } 1686 1687 protected: 1688 /// Destructor. 1689 virtual 1690 ~money_put() { } 1691 1692 /** 1693 * @brief Format and output a monetary value. 1694 * 1695 * This function formats @a units as a monetary value according to 1696 * moneypunct and ctype facets retrieved from io.getloc(), and writes 1697 * the resulting characters to @a __s. For example, the value 1001 in a 1698 * US locale would write <code>$10.01</code> to @a __s. 1699 * 1700 * This function is a hook for derived classes to change the value 1701 * returned. @see put(). 1702 * 1703 * @param __s The stream to write to. 1704 * @param __intl Parameter to use_facet<moneypunct<CharT,intl> >. 1705 * @param __io Source of facets and io state. 1706 * @param __fill char_type to use for padding. 1707 * @param __units Place to store result of parsing. 1708 * @return Iterator after writing. 1709 */ 1710 // XXX GLIBCXX_ABI Deprecated 1711 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \ 1712 && _GLIBCXX_USE_CXX11_ABI == 0 1713 virtual iter_type 1714 __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, 1715 double __units) const; 1716 #else 1717 virtual iter_type 1718 do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, 1719 long double __units) const; 1720 #endif 1721 1722 /** 1723 * @brief Format and output a monetary value. 1724 * 1725 * This function formats @a digits as a monetary value 1726 * according to moneypunct and ctype facets retrieved from 1727 * io.getloc(), and writes the resulting characters to @a __s. 1728 * For example, the string <code>1001</code> in a US locale 1729 * would write <code>$10.01</code> to @a __s. 1730 * 1731 * This function is a hook for derived classes to change the value 1732 * returned. @see put(). 1733 * 1734 * @param __s The stream to write to. 1735 * @param __intl Parameter to use_facet<moneypunct<CharT,intl> >. 1736 * @param __io Source of facets and io state. 1737 * @param __fill char_type to use for padding. 1738 * @param __digits Place to store result of parsing. 1739 * @return Iterator after writing. 1740 */ 1741 virtual iter_type 1742 do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, 1743 const string_type& __digits) const; 1744 1745 // XXX GLIBCXX_ABI Deprecated 1746 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \ 1747 && _GLIBCXX_USE_CXX11_ABI == 0 1748 virtual iter_type 1749 do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, 1750 long double __units) const; 1751 #endif 1752 1753 template<bool _Intl> 1754 iter_type 1755 _M_insert(iter_type __s, ios_base& __io, char_type __fill, 1756 const string_type& __digits) const; 1757 }; 1758 1759 template<typename _CharT, typename _OutIter> 1760 locale::id money_put<_CharT, _OutIter>::id; 1761 1762 _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11 1763 1764 /** 1765 * @brief Messages facet base class providing catalog typedef. 1766 * @ingroup locales 1767 */ 1768 struct messages_base 1769 { 1770 typedef int catalog; 1771 }; 1772 1773 _GLIBCXX_BEGIN_NAMESPACE_CXX11 1774 1775 /** 1776 * @brief Primary class template messages. 1777 * @ingroup locales 1778 * 1779 * This facet encapsulates the code to retrieve messages from 1780 * message catalogs. The only thing defined by the standard for this facet 1781 * is the interface. All underlying functionality is 1782 * implementation-defined. 1783 * 1784 * This library currently implements 3 versions of the message facet. The 1785 * first version (gnu) is a wrapper around gettext, provided by libintl. 1786 * The second version (ieee) is a wrapper around catgets. The final 1787 * version (default) does no actual translation. These implementations are 1788 * only provided for char and wchar_t instantiations. 1789 * 1790 * The messages template uses protected virtual functions to 1791 * provide the actual results. The public accessors forward the 1792 * call to the virtual functions. These virtual functions are 1793 * hooks for developers to implement the behavior they require from 1794 * the messages facet. 1795 */ 1796 template<typename _CharT> 1797 class messages : public locale::facet, public messages_base 1798 { 1799 public: 1800 // Types: 1801 //@{ 1802 /// Public typedefs 1803 typedef _CharT char_type; 1804 typedef basic_string<_CharT> string_type; 1805 //@} 1806 1807 protected: 1808 // Underlying "C" library locale information saved from 1809 // initialization, needed by messages_byname as well. 1810 __c_locale _M_c_locale_messages; 1811 const char* _M_name_messages; 1812 1813 public: 1814 /// Numpunct facet id. 1815 static locale::id id; 1816 1817 /** 1818 * @brief Constructor performs initialization. 1819 * 1820 * This is the constructor provided by the standard. 1821 * 1822 * @param __refs Passed to the base facet class. 1823 */ 1824 explicit 1825 messages(size_t __refs = 0); 1826 1827 // Non-standard. 1828 /** 1829 * @brief Internal constructor. Not for general use. 1830 * 1831 * This is a constructor for use by the library itself to set up new 1832 * locales. 1833 * 1834 * @param __cloc The C locale. 1835 * @param __s The name of a locale. 1836 * @param __refs Refcount to pass to the base class. 1837 */ 1838 explicit 1839 messages(__c_locale __cloc, const char* __s, size_t __refs = 0); 1840 1841 /* 1842 * @brief Open a message catalog. 1843 * 1844 * This function opens and returns a handle to a message catalog by 1845 * returning do_open(__s, __loc). 1846 * 1847 * @param __s The catalog to open. 1848 * @param __loc Locale to use for character set conversions. 1849 * @return Handle to the catalog or value < 0 if open fails. 1850 */ 1851 catalog 1852 open(const basic_string<char>& __s, const locale& __loc) const 1853 { return this->do_open(__s, __loc); } 1854 1855 // Non-standard and unorthodox, yet effective. 1856 /* 1857 * @brief Open a message catalog. 1858 * 1859 * This non-standard function opens and returns a handle to a message 1860 * catalog by returning do_open(s, loc). The third argument provides a 1861 * message catalog root directory for gnu gettext and is ignored 1862 * otherwise. 1863 * 1864 * @param __s The catalog to open. 1865 * @param __loc Locale to use for character set conversions. 1866 * @param __dir Message catalog root directory. 1867 * @return Handle to the catalog or value < 0 if open fails. 1868 */ 1869 catalog 1870 open(const basic_string<char>&, const locale&, const char*) const; 1871 1872 /* 1873 * @brief Look up a string in a message catalog. 1874 * 1875 * This function retrieves and returns a message from a catalog by 1876 * returning do_get(c, set, msgid, s). 1877 * 1878 * For gnu, @a __set and @a msgid are ignored. Returns gettext(s). 1879 * For default, returns s. For ieee, returns catgets(c,set,msgid,s). 1880 * 1881 * @param __c The catalog to access. 1882 * @param __set Implementation-defined. 1883 * @param __msgid Implementation-defined. 1884 * @param __s Default return value if retrieval fails. 1885 * @return Retrieved message or @a __s if get fails. 1886 */ 1887 string_type 1888 get(catalog __c, int __set, int __msgid, const string_type& __s) const 1889 { return this->do_get(__c, __set, __msgid, __s); } 1890 1891 /* 1892 * @brief Close a message catalog. 1893 * 1894 * Closes catalog @a c by calling do_close(c). 1895 * 1896 * @param __c The catalog to close. 1897 */ 1898 void 1899 close(catalog __c) const 1900 { return this->do_close(__c); } 1901 1902 protected: 1903 /// Destructor. 1904 virtual 1905 ~messages(); 1906 1907 /* 1908 * @brief Open a message catalog. 1909 * 1910 * This function opens and returns a handle to a message catalog in an 1911 * implementation-defined manner. This function is a hook for derived 1912 * classes to change the value returned. 1913 * 1914 * @param __s The catalog to open. 1915 * @param __loc Locale to use for character set conversions. 1916 * @return Handle to the opened catalog, value < 0 if open failed. 1917 */ 1918 virtual catalog 1919 do_open(const basic_string<char>&, const locale&) const; 1920 1921 /* 1922 * @brief Look up a string in a message catalog. 1923 * 1924 * This function retrieves and returns a message from a catalog in an 1925 * implementation-defined manner. This function is a hook for derived 1926 * classes to change the value returned. 1927 * 1928 * For gnu, @a __set and @a __msgid are ignored. Returns gettext(s). 1929 * For default, returns s. For ieee, returns catgets(c,set,msgid,s). 1930 * 1931 * @param __c The catalog to access. 1932 * @param __set Implementation-defined. 1933 * @param __msgid Implementation-defined. 1934 * @param __s Default return value if retrieval fails. 1935 * @return Retrieved message or @a __s if get fails. 1936 */ 1937 virtual string_type 1938 do_get(catalog, int, int, const string_type& __dfault) const; 1939 1940 /* 1941 * @brief Close a message catalog. 1942 * 1943 * @param __c The catalog to close. 1944 */ 1945 virtual void 1946 do_close(catalog) const; 1947 1948 // Returns a locale and codeset-converted string, given a char* message. 1949 char* 1950 _M_convert_to_char(const string_type& __msg) const 1951 { 1952 // XXX 1953 return reinterpret_cast<char*>(const_cast<_CharT*>(__msg.c_str())); 1954 } 1955 1956 // Returns a locale and codeset-converted string, given a char* message. 1957 string_type 1958 _M_convert_from_char(char*) const 1959 { 1960 // XXX 1961 return string_type(); 1962 } 1963 }; 1964 1965 template<typename _CharT> 1966 locale::id messages<_CharT>::id; 1967 1968 /// Specializations for required instantiations. 1969 template<> 1970 string 1971 messages<char>::do_get(catalog, int, int, const string&) const; 1972 1973 #ifdef _GLIBCXX_USE_WCHAR_T 1974 template<> 1975 wstring 1976 messages<wchar_t>::do_get(catalog, int, int, const wstring&) const; 1977 #endif 1978 1979 /// class messages_byname [22.2.7.2]. 1980 template<typename _CharT> 1981 class messages_byname : public messages<_CharT> 1982 { 1983 public: 1984 typedef _CharT char_type; 1985 typedef basic_string<_CharT> string_type; 1986 1987 explicit 1988 messages_byname(const char* __s, size_t __refs = 0); 1989 1990 #if __cplusplus >= 201103L 1991 explicit 1992 messages_byname(const string& __s, size_t __refs = 0) 1993 : messages_byname(__s.c_str(), __refs) { } 1994 #endif 1995 1996 protected: 1997 virtual 1998 ~messages_byname() 1999 { } 2000 }; 2001 2002 _GLIBCXX_END_NAMESPACE_CXX11 2003 2004 _GLIBCXX_END_NAMESPACE_VERSION 2005 } // namespace 2006 2007 // Include host and configuration specific messages functions. 2008 #include <bits/messages_members.h> 2009 2010 // 22.2.1.5 Template class codecvt 2011 #include <bits/codecvt.h> 2012 2013 #include <bits/locale_facets_nonio.tcc> 2014 2015 #endif 2016