Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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.