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