Home | History | Annotate | Download | only in bits
      1 // Locale support -*- C++ -*-
      2 
      3 // Copyright (C) 2007-2013 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() == &apos;$&apos;
   1140        *  positive_sign() == &apos;+&apos;, 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  __digits  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  __digits  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 	// XXX
   1859 	return string_type();
   1860       }
   1861      };
   1862 
   1863   template<typename _CharT>
   1864     locale::id messages<_CharT>::id;
   1865 
   1866   /// Specializations for required instantiations.
   1867   template<>
   1868     string
   1869     messages<char>::do_get(catalog, int, int, const string&) const;
   1870 
   1871 #ifdef _GLIBCXX_USE_WCHAR_T
   1872   template<>
   1873     wstring
   1874     messages<wchar_t>::do_get(catalog, int, int, const wstring&) const;
   1875 #endif
   1876 
   1877    /// class messages_byname [22.2.7.2].
   1878    template<typename _CharT>
   1879     class messages_byname : public messages<_CharT>
   1880     {
   1881     public:
   1882       typedef _CharT			char_type;
   1883       typedef basic_string<_CharT>	string_type;
   1884 
   1885       explicit
   1886       messages_byname(const char* __s, size_t __refs = 0);
   1887 
   1888     protected:
   1889       virtual
   1890       ~messages_byname()
   1891       { }
   1892     };
   1893 
   1894 _GLIBCXX_END_NAMESPACE_VERSION
   1895 } // namespace
   1896 
   1897 // Include host and configuration specific messages functions.
   1898 #include <bits/messages_members.h>
   1899 
   1900 // 22.2.1.5  Template class codecvt
   1901 #include <bits/codecvt.h>
   1902 
   1903 #include <bits/locale_facets_nonio.tcc>
   1904 
   1905 #endif
   1906