locale_facets.h

Go to the documentation of this file.
00001 // Locale support -*- C++ -*-
00002 
00003 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
00004 // Free Software Foundation, Inc.
00005 //
00006 // This file is part of the GNU ISO C++ Library.  This library is free
00007 // software; you can redistribute it and/or modify it under the
00008 // terms of the GNU General Public License as published by the
00009 // Free Software Foundation; either version 2, or (at your option)
00010 // any later version.
00011 
00012 // This library is distributed in the hope that it will be useful,
00013 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 // GNU General Public License for more details.
00016 
00017 // You should have received a copy of the GNU General Public License along
00018 // with this library; see the file COPYING.  If not, write to the Free
00019 // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
00020 // USA.
00021 
00022 // As a special exception, you may use this file as part of a free software
00023 // library without restriction.  Specifically, if other files instantiate
00024 // templates or use macros or inline functions from this file, or you compile
00025 // this file and link it with other files to produce an executable, this
00026 // file does not by itself cause the resulting executable to be covered by
00027 // the GNU General Public License.  This exception does not however
00028 // invalidate any other reasons why the executable file might be covered by
00029 // the GNU General Public License.
00030 
00031 //
00032 // ISO C++ 14882: 22.1  Locales
00033 //
00034 
00040 #ifndef _LOCALE_FACETS_H
00041 #define _LOCALE_FACETS_H 1
00042 
00043 #pragma GCC system_header
00044 
00045 #include <ctime>    // For struct tm
00046 #include <cwctype>  // For wctype_t
00047 #include <iosfwd>
00048 #include <bits/ios_base.h>  // For ios_base, ios_base::iostate
00049 #include <streambuf>
00050 
00051 namespace std
00052 {
00053   // NB: Don't instantiate required wchar_t facets if no wchar_t support.
00054 #ifdef _GLIBCXX_USE_WCHAR_T
00055 # define  _GLIBCXX_NUM_FACETS 28
00056 #else
00057 # define  _GLIBCXX_NUM_FACETS 14
00058 #endif
00059 
00060   // Convert string to numeric value of type _Tv and store results.
00061   // NB: This is specialized for all required types, there is no
00062   // generic definition.
00063   template<typename _Tv>
00064     void
00065     __convert_to_v(const char* __in, _Tv& __out, ios_base::iostate& __err,
00066            const __c_locale& __cloc);
00067 
00068   // Explicit specializations for required types.
00069   template<>
00070     void
00071     __convert_to_v(const char*, float&, ios_base::iostate&,
00072            const __c_locale&);
00073 
00074   template<>
00075     void
00076     __convert_to_v(const char*, double&, ios_base::iostate&,
00077            const __c_locale&);
00078 
00079   template<>
00080     void
00081     __convert_to_v(const char*, long double&, ios_base::iostate&,
00082            const __c_locale&);
00083 
00084   // NB: __pad is a struct, rather than a function, so it can be
00085   // partially-specialized.
00086   template<typename _CharT, typename _Traits>
00087     struct __pad
00088     {
00089       static void
00090       _S_pad(ios_base& __io, _CharT __fill, _CharT* __news,
00091          const _CharT* __olds, const streamsize __newlen,
00092          const streamsize __oldlen, const bool __num);
00093     };
00094 
00095   // Used by both numeric and monetary facets.
00096   // Inserts "group separator" characters into an array of characters.
00097   // It's recursive, one iteration per group.  It moves the characters
00098   // in the buffer this way: "xxxx12345" -> "12,345xxx".  Call this
00099   // only with __glen != 0.
00100   template<typename _CharT>
00101     _CharT*
00102     __add_grouping(_CharT* __s, _CharT __sep,
00103            const char* __gbeg, size_t __gsize,
00104            const _CharT* __first, const _CharT* __last);
00105 
00106   // This template permits specializing facet output code for
00107   // ostreambuf_iterator.  For ostreambuf_iterator, sputn is
00108   // significantly more efficient than incrementing iterators.
00109   template<typename _CharT>
00110     inline
00111     ostreambuf_iterator<_CharT>
00112     __write(ostreambuf_iterator<_CharT> __s, const _CharT* __ws, int __len)
00113     {
00114       __s._M_put(__ws, __len);
00115       return __s;
00116     }
00117 
00118   // This is the unspecialized form of the template.
00119   template<typename _CharT, typename _OutIter>
00120     inline
00121     _OutIter
00122     __write(_OutIter __s, const _CharT* __ws, int __len)
00123     {
00124       for (int __j = 0; __j < __len; __j++, ++__s)
00125     *__s = __ws[__j];
00126       return __s;
00127     }
00128 
00129 
00130   // 22.2.1.1  Template class ctype
00131   // Include host and configuration specific ctype enums for ctype_base.
00132   #include <bits/ctype_base.h>
00133 
00134   // Common base for ctype<_CharT>.
00144   template<typename _CharT>
00145     class __ctype_abstract_base : public locale::facet, public ctype_base
00146     {
00147     public:
00148       // Types:
00150       typedef _CharT char_type;
00151 
00162       bool
00163       is(mask __m, char_type __c) const
00164       { return this->do_is(__m, __c); }
00165 
00179       const char_type*
00180       is(const char_type *__lo, const char_type *__hi, mask *__vec) const
00181       { return this->do_is(__lo, __hi, __vec); }
00182 
00195       const char_type*
00196       scan_is(mask __m, const char_type* __lo, const char_type* __hi) const
00197       { return this->do_scan_is(__m, __lo, __hi); }
00198 
00211       const char_type*
00212       scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
00213       { return this->do_scan_not(__m, __lo, __hi); }
00214 
00225       char_type
00226       toupper(char_type __c) const
00227       { return this->do_toupper(__c); }
00228 
00240       const char_type*
00241       toupper(char_type *__lo, const char_type* __hi) const
00242       { return this->do_toupper(__lo, __hi); }
00243 
00254       char_type
00255       tolower(char_type __c) const
00256       { return this->do_tolower(__c); }
00257 
00269       const char_type*
00270       tolower(char_type* __lo, const char_type* __hi) const
00271       { return this->do_tolower(__lo, __hi); }
00272 
00286       char_type
00287       widen(char __c) const
00288       { return this->do_widen(__c); }
00289 
00305       const char*
00306       widen(const char* __lo, const char* __hi, char_type* __to) const
00307       { return this->do_widen(__lo, __hi, __to); }
00308 
00324       char
00325       narrow(char_type __c, char __dfault) const
00326       { return this->do_narrow(__c, __dfault); }
00327 
00346       const char_type*
00347       narrow(const char_type* __lo, const char_type* __hi,
00348           char __dfault, char *__to) const
00349       { return this->do_narrow(__lo, __hi, __dfault, __to); }
00350 
00351     protected:
00352       explicit
00353       __ctype_abstract_base(size_t __refs = 0): facet(__refs) { }
00354 
00355       virtual
00356       ~__ctype_abstract_base() { }
00357 
00371       virtual bool
00372       do_is(mask __m, char_type __c) const = 0;
00373 
00390       virtual const char_type*
00391       do_is(const char_type* __lo, const char_type* __hi,
00392         mask* __vec) const = 0;
00393 
00409       virtual const char_type*
00410       do_scan_is(mask __m, const char_type* __lo,
00411          const char_type* __hi) const = 0;
00412 
00428       virtual const char_type*
00429       do_scan_not(mask __m, const char_type* __lo,
00430           const char_type* __hi) const = 0;
00431 
00446       virtual char_type
00447       do_toupper(char_type) const = 0;
00448 
00463       virtual const char_type*
00464       do_toupper(char_type* __lo, const char_type* __hi) const = 0;
00465 
00479       virtual char_type
00480       do_tolower(char_type) const = 0;
00481 
00496       virtual const char_type*
00497       do_tolower(char_type* __lo, const char_type* __hi) const = 0;
00498 
00515       virtual char_type
00516       do_widen(char) const = 0;
00517 
00536       virtual const char*
00537       do_widen(const char* __lo, const char* __hi,
00538            char_type* __dest) const = 0;
00539 
00558       virtual char
00559       do_narrow(char_type, char __dfault) const = 0;
00560 
00582       virtual const char_type*
00583       do_narrow(const char_type* __lo, const char_type* __hi,
00584         char __dfault, char* __dest) const = 0;
00585     };
00586 
00587   // NB: Generic, mostly useless implementation.
00605   template<typename _CharT>
00606     class ctype : public __ctype_abstract_base<_CharT>
00607     {
00608     public:
00609       // Types:
00610       typedef _CharT            char_type;
00611       typedef typename __ctype_abstract_base<_CharT>::mask mask;
00612 
00614       static locale::id         id;
00615 
00616       explicit
00617       ctype(size_t __refs = 0) : __ctype_abstract_base<_CharT>(__refs) { }
00618 
00619    protected:
00620       virtual
00621       ~ctype();
00622 
00623       virtual bool
00624       do_is(mask __m, char_type __c) const;
00625 
00626       virtual const char_type*
00627       do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
00628 
00629       virtual const char_type*
00630       do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
00631 
00632       virtual const char_type*
00633       do_scan_not(mask __m, const char_type* __lo,
00634           const char_type* __hi) const;
00635 
00636       virtual char_type
00637       do_toupper(char_type __c) const;
00638 
00639       virtual const char_type*
00640       do_toupper(char_type* __lo, const char_type* __hi) const;
00641 
00642       virtual char_type
00643       do_tolower(char_type __c) const;
00644 
00645       virtual const char_type*
00646       do_tolower(char_type* __lo, const char_type* __hi) const;
00647 
00648       virtual char_type
00649       do_widen(char __c) const;
00650 
00651       virtual const char*
00652       do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
00653 
00654       virtual char
00655       do_narrow(char_type, char __dfault) const;
00656 
00657       virtual const char_type*
00658       do_narrow(const char_type* __lo, const char_type* __hi,
00659         char __dfault, char* __dest) const;
00660     };
00661 
00662   template<typename _CharT>
00663     locale::id ctype<_CharT>::id;
00664 
00665   // 22.2.1.3  ctype<char> specialization.
00674   template<>
00675     class ctype<char> : public locale::facet, public ctype_base
00676     {
00677     public:
00678       // Types:
00680       typedef char      char_type;
00681 
00682     protected:
00683       // Data Members:
00684       __c_locale        _M_c_locale_ctype;
00685       bool          _M_del;
00686       __to_type         _M_toupper;
00687       __to_type         _M_tolower;
00688       const mask*       _M_table;
00689       mutable char      _M_widen_ok;
00690       mutable char      _M_widen[1 + static_cast<unsigned char>(-1)];
00691       mutable char      _M_narrow[1 + static_cast<unsigned char>(-1)];
00692       mutable char      _M_narrow_ok;   // 0 uninitialized, 1 init,
00693                         // 2 memcpy can't be used
00694 
00695     public:
00697       static locale::id        id;
00699       static const size_t      table_size = 1 + static_cast<unsigned char>(-1);
00700 
00711       explicit
00712       ctype(const mask* __table = 0, bool __del = false, size_t __refs = 0);
00713 
00724       explicit
00725       ctype(__c_locale __cloc, const mask* __table = 0, bool __del = false,
00726         size_t __refs = 0);
00727 
00737       inline bool
00738       is(mask __m, char __c) const;
00739 
00752       inline const char*
00753       is(const char* __lo, const char* __hi, mask* __vec) const;
00754 
00766       inline const char*
00767       scan_is(mask __m, const char* __lo, const char* __hi) const;
00768 
00780       inline const char*
00781       scan_not(mask __m, const char* __lo, const char* __hi) const;
00782 
00795       char_type
00796       toupper(char_type __c) const
00797       { return this->do_toupper(__c); }
00798 
00812       const char_type*
00813       toupper(char_type *__lo, const char_type* __hi) const
00814       { return this->do_toupper(__lo, __hi); }
00815 
00828       char_type
00829       tolower(char_type __c) const
00830       { return this->do_tolower(__c); }
00831 
00845       const char_type*
00846       tolower(char_type* __lo, const char_type* __hi) const
00847       { return this->do_tolower(__lo, __hi); }
00848 
00865       char_type
00866       widen(char __c) const
00867       {
00868     if (_M_widen_ok)
00869       return _M_widen[static_cast<unsigned char>(__c)];
00870     this->_M_widen_init();
00871     return this->do_widen(__c);
00872       }
00873 
00892       const char*
00893       widen(const char* __lo, const char* __hi, char_type* __to) const
00894       {
00895     if (_M_widen_ok == 1)
00896       {
00897         memcpy(__to, __lo, __hi - __lo);
00898         return __hi;
00899       }
00900     if (!_M_widen_ok)
00901       _M_widen_init();
00902     return this->do_widen(__lo, __hi, __to);
00903       }
00904 
00923       char
00924       narrow(char_type __c, char __dfault) const
00925       {
00926     if (_M_narrow[static_cast<unsigned char>(__c)])
00927       return _M_narrow[static_cast<unsigned char>(__c)];
00928     const char __t = do_narrow(__c, __dfault);
00929     if (__t != __dfault)
00930       _M_narrow[static_cast<unsigned char>(__c)] = __t;
00931     return __t;
00932       }
00933 
00956       const char_type*
00957       narrow(const char_type* __lo, const char_type* __hi,
00958          char __dfault, char *__to) const
00959       {
00960     if (__builtin_expect(_M_narrow_ok == 1, true))
00961       {
00962         memcpy(__to, __lo, __hi - __lo);
00963         return __hi;
00964       }
00965     if (!_M_narrow_ok)
00966       _M_narrow_init();
00967     return this->do_narrow(__lo, __hi, __dfault, __to);
00968       }
00969 
00970     protected:
00973       const mask*
00974       table() const throw()
00975       { return _M_table; }
00976 
00978       static const mask*
00979       classic_table() throw();
00980 
00987       virtual
00988       ~ctype();
00989 
01003       virtual char_type
01004       do_toupper(char_type) const;
01005 
01020       virtual const char_type*
01021       do_toupper(char_type* __lo, const char_type* __hi) const;
01022 
01036       virtual char_type
01037       do_tolower(char_type) const;
01038 
01053       virtual const char_type*
01054       do_tolower(char_type* __lo, const char_type* __hi) const;
01055 
01073       virtual char_type
01074       do_widen(char __c) const
01075       { return __c; }
01076 
01096       virtual const char*
01097       do_widen(const char* __lo, const char* __hi, char_type* __dest) const
01098       {
01099     memcpy(__dest, __lo, __hi - __lo);
01100     return __hi;
01101       }
01102 
01122       virtual char
01123       do_narrow(char_type __c, char) const
01124       { return __c; }
01125 
01148       virtual const char_type*
01149       do_narrow(const char_type* __lo, const char_type* __hi,
01150         char, char* __dest) const
01151       {
01152     memcpy(__dest, __lo, __hi - __lo);
01153     return __hi;
01154       }
01155 
01156     private:
01157 
01158       void _M_widen_init() const
01159       {
01160     char __tmp[sizeof(_M_widen)];
01161     for (size_t __i = 0; __i < sizeof(_M_widen); ++__i)
01162       __tmp[__i] = __i;
01163     do_widen(__tmp, __tmp + sizeof(__tmp), _M_widen);
01164 
01165     _M_widen_ok = 1;
01166     // Set _M_widen_ok to 2 if memcpy can't be used.
01167     if (memcmp(__tmp, _M_widen, sizeof(_M_widen)))
01168       _M_widen_ok = 2;
01169       }
01170 
01171       // Fill in the narrowing cache and flag whether all values are
01172       // valid or not.  _M_narrow_ok is set to 2 if memcpy can't
01173       // be used.
01174       void _M_narrow_init() const
01175       {
01176     char __tmp[sizeof(_M_narrow)];
01177     for (size_t __i = 0; __i < sizeof(_M_narrow); ++__i)
01178       __tmp[__i] = __i;
01179     do_narrow(__tmp, __tmp + sizeof(__tmp), 0, _M_narrow);
01180 
01181     _M_narrow_ok = 1;
01182     if (memcmp(__tmp, _M_narrow, sizeof(_M_narrow)))
01183       _M_narrow_ok = 2;
01184     else
01185       {
01186         // Deal with the special case of zero: renarrow with a
01187         // different default and compare.
01188         char __c;
01189         do_narrow(__tmp, __tmp + 1, 1, &__c);
01190         if (__c == 1)
01191           _M_narrow_ok = 2;
01192       }
01193       }
01194     };
01195 
01196   template<>
01197     const ctype<char>&
01198     use_facet<ctype<char> >(const locale& __loc);
01199 
01200 #ifdef _GLIBCXX_USE_WCHAR_T
01201   // 22.2.1.3  ctype<wchar_t> specialization
01212   template<>
01213     class ctype<wchar_t> : public __ctype_abstract_base<wchar_t>
01214     {
01215     public:
01216       // Types:
01218       typedef wchar_t       char_type;
01219       typedef wctype_t      __wmask_type;
01220 
01221     protected:
01222       __c_locale        _M_c_locale_ctype;
01223 
01224       // Pre-computed narrowed and widened chars.
01225       bool                      _M_narrow_ok;
01226       char                      _M_narrow[128];
01227       wint_t                    _M_widen[1 + static_cast<unsigned char>(-1)];
01228 
01229       // Pre-computed elements for do_is.
01230       mask                      _M_bit[16];
01231       __wmask_type              _M_wmask[16];
01232 
01233     public:
01234       // Data Members:
01236       static locale::id     id;
01237 
01245       explicit
01246       ctype(size_t __refs = 0);
01247 
01256       explicit
01257       ctype(__c_locale __cloc, size_t __refs = 0);
01258 
01259     protected:
01260       __wmask_type
01261       _M_convert_to_wmask(const mask __m) const;
01262 
01264       virtual
01265       ~ctype();
01266 
01280       virtual bool
01281       do_is(mask __m, char_type __c) const;
01282 
01299       virtual const char_type*
01300       do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
01301 
01317       virtual const char_type*
01318       do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
01319 
01335       virtual const char_type*
01336       do_scan_not(mask __m, const char_type* __lo,
01337           const char_type* __hi) const;
01338 
01352       virtual char_type
01353       do_toupper(char_type) const;
01354 
01369       virtual const char_type*
01370       do_toupper(char_type* __lo, const char_type* __hi) const;
01371 
01385       virtual char_type
01386       do_tolower(char_type) const;
01387 
01402       virtual const char_type*
01403       do_tolower(char_type* __lo, const char_type* __hi) const;
01404 
01422       virtual char_type
01423       do_widen(char) const;
01424 
01444       virtual const char*
01445       do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
01446 
01467       virtual char
01468       do_narrow(char_type, char __dfault) const;
01469 
01493       virtual const char_type*
01494       do_narrow(const char_type* __lo, const char_type* __hi,
01495         char __dfault, char* __dest) const;
01496 
01497       // For use at construction time only.
01498       void
01499       _M_initialize_ctype();
01500     };
01501 
01502   template<>
01503     const ctype<wchar_t>&
01504     use_facet<ctype<wchar_t> >(const locale& __loc);
01505 #endif //_GLIBCXX_USE_WCHAR_T
01506 
01507   // Include host and configuration specific ctype inlines.
01508   #include <bits/ctype_inline.h>
01509 
01511   template<typename _CharT>
01512     class ctype_byname : public ctype<_CharT>
01513     {
01514     public:
01515       typedef _CharT        char_type;
01516 
01517       explicit
01518       ctype_byname(const char* __s, size_t __refs = 0);
01519 
01520     protected:
01521       virtual
01522       ~ctype_byname() { };
01523     };
01524 
01526   template<>
01527     ctype_byname<char>::ctype_byname(const char*, size_t refs);
01528 
01529   template<>
01530     ctype_byname<wchar_t>::ctype_byname(const char*, size_t refs);
01531 
01532   // 22.2.1.5  Template class codecvt
01533   #include <bits/codecvt.h>
01534 
01535   // 22.2.2  The numeric category.
01536   class __num_base
01537   {
01538   public:
01539     // NB: Code depends on the order of _S_atoms_out elements.
01540     // Below are the indices into _S_atoms_out.
01541     enum
01542       {
01543         _S_ominus,
01544         _S_oplus,
01545         _S_ox,
01546         _S_oX,
01547         _S_odigits,
01548         _S_odigits_end = _S_odigits + 16,
01549         _S_oudigits = _S_odigits_end,
01550         _S_oudigits_end = _S_oudigits + 16,
01551         _S_oe = _S_odigits + 14,  // For scientific notation, 'e'
01552         _S_oE = _S_oudigits + 14, // For scientific notation, 'E'
01553     _S_oend = _S_oudigits_end
01554       };
01555 
01556     // A list of valid numeric literals for output.  This array
01557     // contains chars that will be passed through the current locale's
01558     // ctype<_CharT>.widen() and then used to render numbers.
01559     // For the standard "C" locale, this is
01560     // "-+xX0123456789abcdef0123456789ABCDEF".
01561     static const char* _S_atoms_out;
01562 
01563     // String literal of acceptable (narrow) input, for num_get.
01564     // "-+xX0123456789abcdefABCDEF"
01565     static const char* _S_atoms_in;
01566 
01567     enum
01568     {
01569       _S_iminus,
01570       _S_iplus,
01571       _S_ix,
01572       _S_iX,
01573       _S_izero,
01574       _S_ie = _S_izero + 14,
01575       _S_iE = _S_izero + 20,
01576       _S_iend = 26
01577     };
01578 
01579     // num_put
01580     // Construct and return valid scanf format for floating point types.
01581     static void
01582     _S_format_float(const ios_base& __io, char* __fptr, char __mod);
01583   };
01584 
01585   template<typename _CharT>
01586     struct __numpunct_cache : public locale::facet
01587     {
01588       const char*           _M_grouping;
01589       size_t                            _M_grouping_size;
01590       bool              _M_use_grouping;
01591       const _CharT*         _M_truename;
01592       size_t                            _M_truename_size;
01593       const _CharT*         _M_falsename;
01594       size_t                            _M_falsename_size;
01595       _CharT                _M_decimal_point;
01596       _CharT                _M_thousands_sep;
01597 
01598       // A list of valid numeric literals for output: in the standard
01599       // "C" locale, this is "-+xX0123456789abcdef0123456789ABCDEF".
01600       // This array contains the chars after having been passed
01601       // through the current locale's ctype<_CharT>.widen().
01602       _CharT                _M_atoms_out[__num_base::_S_oend];
01603 
01604       // A list of valid numeric literals for input: in the standard
01605       // "C" locale, this is "-+xX0123456789abcdefABCDEF"
01606       // This array contains the chars after having been passed
01607       // through the current locale's ctype<_CharT>.widen().
01608       _CharT                _M_atoms_in[__num_base::_S_iend];
01609 
01610       bool              _M_allocated;
01611 
01612       __numpunct_cache(size_t __refs = 0) : facet(__refs),
01613       _M_grouping(NULL), _M_grouping_size(0), _M_use_grouping(false),
01614       _M_truename(NULL), _M_truename_size(0), _M_falsename(NULL),
01615       _M_falsename_size(0), _M_decimal_point(_CharT()),
01616       _M_thousands_sep(_CharT()), _M_allocated(false)
01617       { }
01618 
01619       ~__numpunct_cache();
01620 
01621       void
01622       _M_cache(const locale& __loc);
01623 
01624     private:
01625       __numpunct_cache&
01626       operator=(const __numpunct_cache&);
01627       
01628       explicit
01629       __numpunct_cache(const __numpunct_cache&);
01630     };
01631 
01632   template<typename _CharT>
01633     __numpunct_cache<_CharT>::~__numpunct_cache()
01634     {
01635       if (_M_allocated)
01636     {
01637       delete [] _M_grouping;
01638       delete [] _M_truename;
01639       delete [] _M_falsename;
01640     }
01641     }
01642 
01656   template<typename _CharT>
01657     class numpunct : public locale::facet
01658     {
01659     public:
01660       // Types:
01662 
01663       typedef _CharT            char_type;
01664       typedef basic_string<_CharT>  string_type;
01666       typedef __numpunct_cache<_CharT>  __cache_type;
01667 
01668     protected:
01669       __cache_type*         _M_data;
01670 
01671     public:
01673       static locale::id         id;
01674 
01680       explicit
01681       numpunct(size_t __refs = 0) : facet(__refs), _M_data(NULL)
01682       { _M_initialize_numpunct(); }
01683 
01693       explicit
01694       numpunct(__cache_type* __cache, size_t __refs = 0)
01695       : facet(__refs), _M_data(__cache)
01696       { _M_initialize_numpunct(); }
01697 
01707       explicit
01708       numpunct(__c_locale __cloc, size_t __refs = 0)
01709       : facet(__refs), _M_data(NULL)
01710       { _M_initialize_numpunct(__cloc); }
01711 
01721       char_type
01722       decimal_point() const
01723       { return this->do_decimal_point(); }
01724 
01734       char_type
01735       thousands_sep() const
01736       { return this->do_thousands_sep(); }
01737 
01765       string
01766       grouping() const
01767       { return this->do_grouping(); }
01768 
01778       string_type
01779       truename() const
01780       { return this->do_truename(); }
01781 
01791       string_type
01792       falsename() const
01793       { return this->do_falsename(); }
01794 
01795     protected:
01797       virtual
01798       ~numpunct();
01799 
01808       virtual char_type
01809       do_decimal_point() const
01810       { return _M_data->_M_decimal_point; }
01811 
01820       virtual char_type
01821       do_thousands_sep() const
01822       { return _M_data->_M_thousands_sep; }
01823 
01833       virtual string
01834       do_grouping() const
01835       { return _M_data->_M_grouping; }
01836 
01846       virtual string_type
01847       do_truename() const
01848       { return _M_data->_M_truename; }
01849 
01859       virtual string_type
01860       do_falsename() const
01861       { return _M_data->_M_falsename; }
01862 
01863       // For use at construction time only.
01864       void
01865       _M_initialize_numpunct(__c_locale __cloc = NULL);
01866     };
01867 
01868   template<typename _CharT>
01869     locale::id numpunct<_CharT>::id;
01870 
01871   template<>
01872     numpunct<char>::~numpunct();
01873 
01874   template<>
01875     void
01876     numpunct<char>::_M_initialize_numpunct(__c_locale __cloc);
01877 
01878 #ifdef _GLIBCXX_USE_WCHAR_T
01879   template<>
01880     numpunct<wchar_t>::~numpunct();
01881 
01882   template<>
01883     void
01884     numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc);
01885 #endif
01886 
01888   template<typename _CharT>
01889     class numpunct_byname : public numpunct<_CharT>
01890     {
01891     public:
01892       typedef _CharT            char_type;
01893       typedef basic_string<_CharT>  string_type;
01894 
01895       explicit
01896       numpunct_byname(const char* __s, size_t __refs = 0)
01897       : numpunct<_CharT>(__refs)
01898       {
01899     if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
01900       {
01901         __c_locale __tmp;
01902         this->_S_create_c_locale(__tmp, __s);
01903         this->_M_initialize_numpunct(__tmp);
01904         this->_S_destroy_c_locale(__tmp);
01905       }
01906       }
01907 
01908     protected:
01909       virtual
01910       ~numpunct_byname() { }
01911     };
01912 
01913 _GLIBCXX_BEGIN_LDBL_NAMESPACE
01926   template<typename _CharT, typename _InIter>
01927     class num_get : public locale::facet
01928     {
01929     public:
01930       // Types:
01932 
01933       typedef _CharT            char_type;
01934       typedef _InIter           iter_type;
01936 
01938       static locale::id         id;
01939 
01947       explicit
01948       num_get(size_t __refs = 0) : facet(__refs) { }
01949 
01973       iter_type
01974       get(iter_type __in, iter_type __end, ios_base& __io,
01975       ios_base::iostate& __err, bool& __v) const
01976       { return this->do_get(__in, __end, __io, __err, __v); }
01977 
01979 
02009       iter_type
02010       get(iter_type __in, iter_type __end, ios_base& __io,
02011       ios_base::iostate& __err, long& __v) const
02012       { return this->do_get(__in, __end, __io, __err, __v); }
02013 
02014       iter_type
02015       get(iter_type __in, iter_type __end, ios_base& __io,
02016       ios_base::iostate& __err, unsigned short& __v) const
02017       { return this->do_get(__in, __end, __io, __err, __v); }
02018 
02019       iter_type
02020       get(iter_type __in, iter_type __end, ios_base& __io,
02021       ios_base::iostate& __err, unsigned int& __v)   const
02022       { return this->do_get(__in, __end, __io, __err, __v); }
02023 
02024       iter_type
02025       get(iter_type __in, iter_type __end, ios_base& __io,
02026       ios_base::iostate& __err, unsigned long& __v)  const
02027       { return this->do_get(__in, __end, __io, __err, __v); }
02028 
02029 #ifdef _GLIBCXX_USE_LONG_LONG
02030       iter_type
02031       get(iter_type __in, iter_type __end, ios_base& __io,
02032       ios_base::iostate& __err, long long& __v) const
02033       { return this->do_get(__in, __end, __io, __err, __v); }
02034 
02035       iter_type
02036       get(iter_type __in, iter_type __end, ios_base& __io,
02037       ios_base::iostate& __err, unsigned long long& __v)  const
02038       { return this->do_get(__in, __end, __io, __err, __v); }
02039 #endif
02040 
02041 
02043 
02068       iter_type
02069       get(iter_type __in, iter_type __end, ios_base& __io,
02070       ios_base::iostate& __err, float& __v) const
02071       { return this->do_get(__in, __end, __io, __err, __v); }
02072 
02073       iter_type
02074       get(iter_type __in, iter_type __end, ios_base& __io,
02075       ios_base::iostate& __err, double& __v) const
02076       { return this->do_get(__in, __end, __io, __err, __v); }
02077 
02078       iter_type
02079       get(iter_type __in, iter_type __end, ios_base& __io,
02080       ios_base::iostate& __err, long double& __v) const
02081       { return this->do_get(__in, __end, __io, __err, __v); }
02083 
02110       iter_type
02111       get(iter_type __in, iter_type __end, ios_base& __io,
02112       ios_base::iostate& __err, void*& __v) const
02113       { return this->do_get(__in, __end, __io, __err, __v); }
02114 
02115     protected:
02117       virtual ~num_get() { }
02118 
02119       iter_type
02120       _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
02121                string& __xtrc) const;
02122 
02123       template<typename _ValueT>
02124         iter_type
02125         _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
02126                _ValueT& __v) const;
02127 
02129 
02143       virtual iter_type
02144       do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
02145 
02146 
02147       virtual iter_type
02148       do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, long&) const;
02149 
02150       virtual iter_type
02151       do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
02152           unsigned short&) const;
02153 
02154       virtual iter_type
02155       do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
02156          unsigned int&) const;
02157 
02158       virtual iter_type
02159       do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
02160          unsigned long&) const;
02161 
02162 #ifdef _GLIBCXX_USE_LONG_LONG
02163       virtual iter_type
02164       do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
02165          long long&) const;
02166 
02167       virtual iter_type
02168       do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
02169          unsigned long long&) const;
02170 #endif
02171 
02172       virtual iter_type
02173       do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
02174          float&) const;
02175 
02176       virtual iter_type
02177       do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
02178          double&) const;
02179 
02180       // XXX GLIBCXX_ABI Deprecated
02181 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
02182       virtual iter_type
02183       __do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
02184            double&) const;
02185 #else
02186       virtual iter_type
02187       do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
02188          long double&) const;
02189 #endif
02190 
02191       virtual iter_type
02192       do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
02193          void*&) const;
02194 
02195       // XXX GLIBCXX_ABI Deprecated
02196 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
02197       virtual iter_type
02198       do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
02199          long double&) const;
02200 #endif
02201 
02202     };
02203 
02204   template<typename _CharT, typename _InIter>
02205     locale::id num_get<_CharT, _InIter>::id;
02206 
02207 
02219   template<typename _CharT, typename _OutIter>
02220     class num_put : public locale::facet
02221     {
02222     public:
02223       // Types:
02225 
02226       typedef _CharT        char_type;
02227       typedef _OutIter      iter_type;
02229 
02231       static locale::id     id;
02232 
02240       explicit
02241       num_put(size_t __refs = 0) : facet(__refs) { }
02242 
02258       iter_type
02259       put(iter_type __s, ios_base& __f, char_type __fill, bool __v) const
02260       { return this->do_put(__s, __f, __fill, __v); }
02261 
02263 
02300       iter_type
02301       put(iter_type __s, ios_base& __f, char_type __fill, long __v) const
02302       { return this->do_put(__s, __f, __fill, __v); }
02303 
02304       iter_type
02305       put(iter_type __s, ios_base& __f, char_type __fill,
02306       unsigned long __v) const
02307       { return this->do_put(__s, __f, __fill, __v); }
02308 
02309 #ifdef _GLIBCXX_USE_LONG_LONG
02310       iter_type
02311       put(iter_type __s, ios_base& __f, char_type __fill, long long __v) const
02312       { return this->do_put(__s, __f, __fill, __v); }
02313 
02314       iter_type
02315       put(iter_type __s, ios_base& __f, char_type __fill,
02316       unsigned long long __v) const
02317       { return this->do_put(__s, __f, __fill, __v); }
02318 #endif
02319 
02320 
02322 
02363       iter_type
02364       put(iter_type __s, ios_base& __f, char_type __fill, double __v) const
02365       { return this->do_put(__s, __f, __fill, __v); }
02366 
02367       iter_type
02368       put(iter_type __s, ios_base& __f, char_type __fill,
02369       long double __v) const
02370       { return this->do_put(__s, __f, __fill, __v); }
02372 
02388       iter_type
02389       put(iter_type __s, ios_base& __f, char_type __fill,
02390       const void* __v) const
02391       { return this->do_put(__s, __f, __fill, __v); }
02392 
02393     protected:
02394       template<typename _ValueT>
02395         iter_type
02396         _M_insert_float(iter_type, ios_base& __io, char_type __fill,
02397             char __mod, _ValueT __v) const;
02398 
02399       void
02400       _M_group_float(const char* __grouping, size_t __grouping_size,
02401              char_type __sep, const char_type* __p, char_type* __new,
02402              char_type* __cs, int& __len) const;
02403 
02404       template<typename _ValueT>
02405         iter_type
02406         _M_insert_int(iter_type, ios_base& __io, char_type __fill,
02407               _ValueT __v) const;
02408 
02409       void
02410       _M_group_int(const char* __grouping, size_t __grouping_size,
02411            char_type __sep, ios_base& __io, char_type* __new,
02412            char_type* __cs, int& __len) const;
02413 
02414       void
02415       _M_pad(char_type __fill, streamsize __w, ios_base& __io,
02416          char_type* __new, const char_type* __cs, int& __len) const;
02417 
02419       virtual
02420       ~num_put() { };
02421 
02423 
02436       virtual iter_type
02437       do_put(iter_type, ios_base&, char_type __fill, bool __v) const;
02438 
02439       virtual iter_type
02440       do_put(iter_type, ios_base&, char_type __fill, long __v) const;
02441 
02442       virtual iter_type
02443       do_put(iter_type, ios_base&, char_type __fill, unsigned long) const;
02444 
02445 #ifdef _GLIBCXX_USE_LONG_LONG
02446       virtual iter_type
02447       do_put(iter_type, ios_base&, char_type __fill, long long __v) const;
02448 
02449       virtual iter_type
02450       do_put(iter_type, ios_base&, char_type __fill, unsigned long long) const;
02451 #endif
02452 
02453       virtual iter_type
02454       do_put(iter_type, ios_base&, char_type __fill, double __v) const;
02455 
02456       // XXX GLIBCXX_ABI Deprecated
02457 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
02458       virtual iter_type
02459       __do_put(iter_type, ios_base&, char_type __fill, double __v) const;
02460 #else
02461       virtual iter_type
02462       do_put(iter_type, ios_base&, char_type __fill, long double __v) const;
02463 #endif
02464 
02465       virtual iter_type
02466       do_put(iter_type, ios_base&, char_type __fill, const void* __v) const;
02467 
02468       // XXX GLIBCXX_ABI Deprecated
02469 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
02470       virtual iter_type
02471       do_put(iter_type, ios_base&, char_type __fill, long double __v) const;
02472 #endif
02473 
02474     };
02475 
02476   template <typename _CharT, typename _OutIter>
02477     locale::id num_put<_CharT, _OutIter>::id;
02478 
02479 _GLIBCXX_END_LDBL_NAMESPACE
02480 
02493   template<typename _CharT>
02494     class collate : public locale::facet
02495     {
02496     public:
02497       // Types:
02499 
02500       typedef _CharT            char_type;
02501       typedef basic_string<_CharT>  string_type;
02503 
02504     protected:
02505       // Underlying "C" library locale information saved from
02506       // initialization, needed by collate_byname as well.
02507       __c_locale            _M_c_locale_collate;
02508 
02509     public:
02511       static locale::id         id;
02512 
02520       explicit
02521       collate(size_t __refs = 0)
02522       : facet(__refs), _M_c_locale_collate(_S_get_c_locale())
02523       { }
02524 
02534       explicit
02535       collate(__c_locale __cloc, size_t __refs = 0)
02536       : facet(__refs), _M_c_locale_collate(_S_clone_c_locale(__cloc))
02537       { }
02538 
02551       int
02552       compare(const _CharT* __lo1, const _CharT* __hi1,
02553           const _CharT* __lo2, const _CharT* __hi2) const
02554       { return this->do_compare(__lo1, __hi1, __lo2, __hi2); }
02555 
02570       string_type
02571       transform(const _CharT* __lo, const _CharT* __hi) const
02572       { return this->do_transform(__lo, __hi); }
02573 
02584       long
02585       hash(const _CharT* __lo, const _CharT* __hi) const
02586       { return this->do_hash(__lo, __hi); }
02587 
02588       // Used to abstract out _CharT bits in virtual member functions, below.
02589       int
02590       _M_compare(const _CharT*, const _CharT*) const;
02591 
02592       size_t
02593       _M_transform(_CharT*, const _CharT*, size_t) const;
02594 
02595   protected:
02597       virtual
02598       ~collate()
02599       { _S_destroy_c_locale(_M_c_locale_collate); }
02600 
02613       virtual int
02614       do_compare(const _CharT* __lo1, const _CharT* __hi1,
02615          const _CharT* __lo2, const _CharT* __hi2) const;
02616 
02629       virtual string_type
02630       do_transform(const _CharT* __lo, const _CharT* __hi) const;
02631 
02642       virtual long
02643       do_hash(const _CharT* __lo, const _CharT* __hi) const;
02644     };
02645 
02646   template<typename _CharT>
02647     locale::id collate<_CharT>::id;
02648 
02649   // Specializations.
02650   template<>
02651     int
02652     collate<char>::_M_compare(const char*, const char*) const;
02653 
02654   template<>
02655     size_t
02656     collate<char>::_M_transform(char*, const char*, size_t) const;
02657 
02658 #ifdef _GLIBCXX_USE_WCHAR_T
02659   template<>
02660     int
02661     collate<wchar_t>::_M_compare(const wchar_t*, const wchar_t*) const;
02662 
02663   template<>
02664     size_t
02665     collate<wchar_t>::_M_transform(wchar_t*, const wchar_t*, size_t) const;
02666 #endif
02667 
02669   template<typename _CharT>
02670     class collate_byname : public collate<_CharT>
02671     {
02672     public:
02674 
02675       typedef _CharT               char_type;
02676       typedef basic_string<_CharT> string_type;
02678 
02679       explicit
02680       collate_byname(const char* __s, size_t __refs = 0)
02681       : collate<_CharT>(__refs)
02682       {
02683     if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
02684       {
02685         this->_S_destroy_c_locale(this->_M_c_locale_collate);
02686         this->_S_create_c_locale(this->_M_c_locale_collate, __s);
02687       }
02688       }
02689 
02690     protected:
02691       virtual
02692       ~collate_byname() { }
02693     };
02694 
02695 
02702   class time_base
02703   {
02704   public:
02705     enum dateorder { no_order, dmy, mdy, ymd, ydm };
02706   };
02707 
02708   template<typename _CharT>
02709     struct __timepunct_cache : public locale::facet
02710     {
02711       // List of all known timezones, with GMT first.
02712       static const _CharT*      _S_timezones[14];
02713 
02714       const _CharT*         _M_date_format;
02715       const _CharT*         _M_date_era_format;
02716       const _CharT*         _M_time_format;
02717       const _CharT*         _M_time_era_format;
02718       const _CharT*         _M_date_time_format;
02719       const _CharT*         _M_date_time_era_format;
02720       const _CharT*         _M_am;
02721       const _CharT*         _M_pm;
02722       const _CharT*         _M_am_pm_format;
02723 
02724       // Day names, starting with "C"'s Sunday.
02725       const _CharT*         _M_day1;
02726       const _CharT*         _M_day2;
02727       const _CharT*         _M_day3;
02728       const _CharT*         _M_day4;
02729       const _CharT*         _M_day5;
02730       const _CharT*         _M_day6;
02731       const _CharT*         _M_day7;
02732 
02733       // Abbreviated day names, starting with "C"'s Sun.
02734       const _CharT*         _M_aday1;
02735       const _CharT*         _M_aday2;
02736       const _CharT*         _M_aday3;
02737       const _CharT*         _M_aday4;
02738       const _CharT*         _M_aday5;
02739       const _CharT*         _M_aday6;
02740       const _CharT*         _M_aday7;
02741 
02742       // Month names, starting with "C"'s January.
02743       const _CharT*         _M_month01;
02744       const _CharT*         _M_month02;
02745       const _CharT*         _M_month03;
02746       const _CharT*         _M_month04;
02747       const _CharT*         _M_month05;
02748       const _CharT*         _M_month06;
02749       const _CharT*         _M_month07;
02750       const _CharT*         _M_month08;
02751       const _CharT*         _M_month09;
02752       const _CharT*         _M_month10;
02753       const _CharT*         _M_month11;
02754       const _CharT*         _M_month12;
02755 
02756       // Abbreviated month names, starting with "C"'s Jan.
02757       const _CharT*         _M_amonth01;
02758       const _CharT*         _M_amonth02;
02759       const _CharT*         _M_amonth03;
02760       const _CharT*         _M_amonth04;
02761       const _CharT*         _M_amonth05;
02762       const _CharT*         _M_amonth06;
02763       const _CharT*         _M_amonth07;
02764       const _CharT*         _M_amonth08;
02765       const _CharT*         _M_amonth09;
02766       const _CharT*         _M_amonth10;
02767       const _CharT*         _M_amonth11;
02768       const _CharT*         _M_amonth12;
02769 
02770       bool              _M_allocated;
02771 
02772       __timepunct_cache(size_t __refs = 0) : facet(__refs),
02773       _M_date_format(NULL), _M_date_era_format(NULL), _M_time_format(NULL),
02774       _M_time_era_format(NULL), _M_date_time_format(NULL),
02775       _M_date_time_era_format(NULL), _M_am(NULL), _M_pm(NULL),
02776       _M_am_pm_format(NULL), _M_day1(NULL), _M_day2(NULL), _M_day3(NULL),
02777       _M_day4(NULL), _M_day5(NULL), _M_day6(NULL), _M_day7(NULL),
02778       _M_aday1(NULL), _M_aday2(NULL), _M_aday3(NULL), _M_aday4(NULL),
02779       _M_aday5(NULL), _M_aday6(NULL), _M_aday7(NULL), _M_month01(NULL),
02780       _M_month02(NULL), _M_month03(NULL), _M_month04(NULL), _M_month05(NULL),
02781       _M_month06(NULL), _M_month07(NULL), _M_month08(NULL), _M_month09(NULL),
02782       _M_month10(NULL), _M_month11(NULL), _M_month12(NULL), _M_amonth01(NULL),
02783       _M_amonth02(NULL), _M_amonth03(NULL), _M_amonth04(NULL),
02784       _M_amonth05(NULL), _M_amonth06(NULL), _M_amonth07(NULL),
02785       _M_amonth08(NULL), _M_amonth09(NULL), _M_amonth10(NULL),
02786       _M_amonth11(NULL), _M_amonth12(NULL), _M_allocated(false)
02787       { }
02788 
02789       ~__timepunct_cache();
02790 
02791       void
02792       _M_cache(const locale& __loc);
02793 
02794     private:
02795       __timepunct_cache&
02796       operator=(const __timepunct_cache&);
02797       
02798       explicit
02799       __timepunct_cache(const __timepunct_cache&);
02800     };
02801 
02802   template<typename _CharT>
02803     __timepunct_cache<_CharT>::~__timepunct_cache()
02804     {
02805       if (_M_allocated)
02806     {
02807       // Unused.
02808     }
02809     }
02810 
02811   // Specializations.
02812   template<>
02813     const char*
02814     __timepunct_cache<char>::_S_timezones[14];
02815 
02816 #ifdef _GLIBCXX_USE_WCHAR_T
02817   template<>
02818     const wchar_t*
02819     __timepunct_cache<wchar_t>::_S_timezones[14];
02820 #endif
02821 
02822   // Generic.
02823   template<typename _CharT>
02824     const _CharT* __timepunct_cache<_CharT>::_S_timezones[14];
02825 
02826   template<typename _CharT>
02827     class __timepunct : public locale::facet
02828     {
02829     public:
02830       // Types:
02831       typedef _CharT            __char_type;
02832       typedef basic_string<_CharT>  __string_type;
02833       typedef __timepunct_cache<_CharT> __cache_type;
02834 
02835     protected:
02836       __cache_type*         _M_data;
02837       __c_locale            _M_c_locale_timepunct;
02838       const char*           _M_name_timepunct;
02839 
02840     public:
02842       static locale::id         id;
02843 
02844       explicit
02845       __timepunct(size_t __refs = 0);
02846 
02847       explicit
02848       __timepunct(__cache_type* __cache, size_t __refs = 0);
02849 
02860       explicit
02861       __timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0);
02862 
02863       // FIXME: for error checking purposes _M_put should return the return
02864       // value of strftime/wcsftime.
02865       void
02866       _M_put(_CharT* __s, size_t __maxlen, const _CharT* __format,
02867          const tm* __tm) const;
02868 
02869       void
02870       _M_date_formats(const _CharT** __date) const
02871       {
02872     // Always have default first.
02873     __date[0] = _M_data->_M_date_format;
02874     __date[1] = _M_data->_M_date_era_format;
02875       }
02876 
02877       void
02878       _M_time_formats(const _CharT** __time) const
02879       {
02880     // Always have default first.
02881     __time[0] = _M_data->_M_time_format;
02882     __time[1] = _M_data->_M_time_era_format;
02883       }
02884 
02885       void
02886       _M_date_time_formats(const _CharT** __dt) const
02887       {
02888     // Always have default first.
02889     __dt[0] = _M_data->_M_date_time_format;
02890     __dt[1] = _M_data->_M_date_time_era_format;
02891       }
02892 
02893       void
02894       _M_am_pm_format(const _CharT* __ampm) const
02895       { __ampm = _M_data->_M_am_pm_format; }
02896 
02897       void
02898       _M_am_pm(const _CharT** __ampm) const
02899       {
02900     __ampm[0] = _M_data->_M_am;
02901     __ampm[1] = _M_data->_M_pm;
02902       }
02903 
02904       void
02905       _M_days(const _CharT** __days) const
02906       {
02907     __days[0] = _M_data->_M_day1;
02908     __days[1] = _M_data->_M_day2;
02909     __days[2] = _M_data->_M_day3;
02910     __days[3] = _M_data->_M_day4;
02911     __days[4] = _M_data->_M_day5;
02912     __days[5] = _M_data->_M_day6;
02913     __days[6] = _M_data->_M_day7;
02914       }
02915 
02916       void
02917       _M_days_abbreviated(const _CharT** __days) const
02918       {
02919     __days[0] = _M_data->_M_aday1;
02920     __days[1] = _M_data->_M_aday2;
02921     __days[2] = _M_data->_M_aday3;
02922     __days[3] = _M_data->_M_aday4;
02923     __days[4] = _M_data->_M_aday5;
02924     __days[5] = _M_data->_M_aday6;
02925     __days[6] = _M_data->_M_aday7;
02926       }
02927 
02928       void
02929       _M_months(const _CharT** __months) const
02930       {
02931     __months[0] = _M_data->_M_month01;
02932     __months[1] = _M_data->_M_month02;
02933     __months[2] = _M_data->_M_month03;
02934     __months[3] = _M_data->_M_month04;
02935     __months[4] = _M_data->_M_month05;
02936     __months[5] = _M_data->_M_month06;
02937     __months[6] = _M_data->_M_month07;
02938     __months[7] = _M_data->_M_month08;
02939     __months[8] = _M_data->_M_month09;
02940     __months[9] = _M_data->_M_month10;
02941     __months[10] = _M_data->_M_month11;
02942     __months[11] = _M_data->_M_month12;
02943       }
02944 
02945       void
02946       _M_months_abbreviated(const _CharT** __months) const
02947       {
02948     __months[0] = _M_data->_M_amonth01;
02949     __months[1] = _M_data->_M_amonth02;
02950     __months[2] = _M_data->_M_amonth03;
02951     __months[3] = _M_data->_M_amonth04;
02952     __months[4] = _M_data->_M_amonth05;
02953     __months[5] = _M_data->_M_amonth06;
02954     __months[6] = _M_data->_M_amonth07;
02955     __months[7] = _M_data->_M_amonth08;
02956     __months[8] = _M_data->_M_amonth09;
02957     __months[9] = _M_data->_M_amonth10;
02958     __months[10] = _M_data->_M_amonth11;
02959     __months[11] = _M_data->_M_amonth12;
02960       }
02961 
02962     protected:
02963       virtual
02964       ~__timepunct();
02965 
02966       // For use at construction time only.
02967       void
02968       _M_initialize_timepunct(__c_locale __cloc = NULL);
02969     };
02970 
02971   template<typename _CharT>
02972     locale::id __timepunct<_CharT>::id;
02973 
02974   // Specializations.
02975   template<>
02976     void
02977     __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc);
02978 
02979   template<>
02980     void
02981     __timepunct<char>::_M_put(char*, size_t, const char*, const tm*) const;
02982 
02983 #ifdef _GLIBCXX_USE_WCHAR_T
02984   template<>
02985     void
02986     __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc);
02987 
02988   template<>
02989     void
02990     __timepunct<wchar_t>::_M_put(wchar_t*, size_t, const wchar_t*,
02991                  const tm*) const;
02992 #endif
02993 
02994   // Include host and configuration specific timepunct functions.
02995   #include <bits/time_members.h>
02996 
03009   template<typename _CharT, typename _InIter>
03010     class time_get : public locale::facet, public time_base
03011     {
03012     public:
03013       // Types:
03015 
03016       typedef _CharT            char_type;
03017       typedef _InIter           iter_type;
03019       typedef basic_string<_CharT>  __string_type;
03020 
03022       static locale::id         id;
03023 
03031       explicit
03032       time_get(size_t __refs = 0)
03033       : facet (__refs) { }
03034 
03048       dateorder
03049       date_order()  const
03050       { return this->do_date_order(); }
03051 
03072       iter_type
03073       get_time(iter_type __beg, iter_type __end, ios_base& __io,
03074            ios_base::iostate& __err, tm* __tm)  const
03075       { return this->do_get_time(__beg, __end, __io, __err, __tm); }
03076 
03097       iter_type
03098       get_date(iter_type __beg, iter_type __end, ios_base& __io,
03099            ios_base::iostate& __err, tm* __tm)  const
03100       { return this->do_get_date(__beg, __end, __io, __err, __tm); }
03101 
03125       iter_type
03126       get_weekday(iter_type __beg, iter_type __end, ios_base& __io,
03127           ios_base::iostate& __err, tm* __tm) const
03128       { return this->do_get_weekday(__beg, __end, __io, __err, __tm); }
03129 
03154       iter_type
03155       get_monthname(iter_type __beg, iter_type __end, ios_base& __io,
03156             ios_base::iostate& __err, tm* __tm) const
03157       { return this->do_get_monthname(__beg, __end, __io, __err, __tm); }
03158 
03180       iter_type
03181       get_year(iter_type __beg, iter_type __end, ios_base& __io,
03182            ios_base::iostate& __err, tm* __tm) const
03183       { return this->do_get_year(__beg, __end, __io, __err, __tm); }
03184 
03185     protected:
03187       virtual
03188       ~time_get() { }
03189 
03200       virtual dateorder
03201       do_date_order() const;
03202 
03218       virtual iter_type
03219       do_get_time(iter_type __beg, iter_type __end, ios_base& __io,
03220           ios_base::iostate& __err, tm* __tm) const;
03221 
03237       virtual iter_type
03238       do_get_date(iter_type __beg, iter_type __end, ios_base& __io,
03239           ios_base::iostate& __err, tm* __tm) const;
03240 
03256       virtual iter_type
03257       do_get_weekday(iter_type __beg, iter_type __end, ios_base&,
03258              ios_base::iostate& __err, tm* __tm) const;
03259 
03275       virtual iter_type
03276       do_get_monthname(iter_type __beg, iter_type __end, ios_base&,
03277                ios_base::iostate& __err, tm* __tm) const;
03278 
03294       virtual iter_type
03295       do_get_year(iter_type __beg, iter_type __end, ios_base& __io,
03296           ios_base::iostate& __err, tm* __tm) const;
03297 
03298       // Extract numeric component of length __len.
03299       iter_type
03300       _M_extract_num(iter_type __beg, iter_type __end, int& __member,
03301              int __min, int __max, size_t __len,
03302              ios_base& __io, ios_base::iostate& __err) const;
03303 
03304       // Extract day or month name, or any unique array of string
03305       // literals in a const _CharT* array.
03306       iter_type
03307       _M_extract_name(iter_type __beg, iter_type __end, int& __member,
03308               const _CharT** __names, size_t __indexlen,
03309               ios_base& __io, ios_base::iostate& __err) const;
03310 
03311       // Extract on a component-by-component basis, via __format argument.
03312       iter_type
03313       _M_extract_via_format(iter_type __beg, iter_type __end, ios_base& __io,
03314                 ios_base::iostate& __err, tm* __tm,
03315                 const _CharT* __format) const;
03316     };
03317 
03318   template<typename _CharT, typename _InIter>
03319     locale::id time_get<_CharT, _InIter>::id;
03320 
03322   template<typename _CharT, typename _InIter>
03323     class time_get_byname : public time_get<_CharT, _InIter>
03324     {
03325     public:
03326       // Types:
03327       typedef _CharT            char_type;
03328       typedef _InIter           iter_type;
03329 
03330       explicit
03331       time_get_byname(const char*, size_t __refs = 0)
03332       : time_get<_CharT, _InIter>(__refs) { }
03333 
03334     protected:
03335       virtual
03336       ~time_get_byname() { }
03337     };
03338 
03350   template<typename _CharT, typename _OutIter>
03351     class time_put : public locale::facet
03352     {
03353     public:
03354       // Types:
03356 
03357       typedef _CharT            char_type;
03358       typedef _OutIter          iter_type;
03360 
03362       static locale::id         id;
03363 
03371       explicit
03372       time_put(size_t __refs = 0)
03373       : facet(__refs) { }
03374 
03390       iter_type
03391       put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
03392       const _CharT* __beg, const _CharT* __end) const;
03393 
03410       iter_type
03411       put(iter_type __s, ios_base& __io, char_type __fill,
03412       const tm* __tm, char __format, char __mod = 0) const
03413       { return this->do_put(__s, __io, __fill, __tm, __format, __mod); }
03414 
03415     protected:
03417       virtual
03418       ~time_put()
03419       { }
03420 
03437       virtual iter_type
03438       do_put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
03439          char __format, char __mod) const;
03440     };
03441 
03442   template<typename _CharT, typename _OutIter>
03443     locale::id time_put<_CharT, _OutIter>::id;
03444 
03446   template<typename _CharT, typename _OutIter>
03447     class time_put_byname : public time_put<_CharT, _OutIter>
03448     {
03449     public:
03450       // Types:
03451       typedef _CharT            char_type;
03452       typedef _OutIter          iter_type;
03453 
03454       explicit
03455       time_put_byname(const char*, size_t __refs = 0)
03456       : time_put<_CharT, _OutIter>(__refs)
03457       { };
03458 
03459     protected:
03460       virtual
03461       ~time_put_byname() { }
03462     };
03463 
03464 
03475   class money_base
03476   {
03477   public:
03478     enum part { none, space, symbol, sign, value };
03479     struct pattern { char field[4]; };
03480 
03481     static const pattern _S_default_pattern;
03482 
03483     enum
03484     {
03485       _S_minus,
03486       _S_zero,
03487       _S_end = 11
03488     };
03489 
03490     // String literal of acceptable (narrow) input/output, for
03491     // money_get/money_put. "-0123456789"
03492     static const char* _S_atoms;
03493 
03494     // Construct and return valid pattern consisting of some combination of:
03495     // space none symbol sign value
03496     static pattern
03497     _S_construct_pattern(char __precedes, char __space, char __posn);
03498   };
03499 
03500   template<typename _CharT, bool _Intl>
03501     struct __moneypunct_cache : public locale::facet
03502     {
03503       const char*           _M_grouping;
03504       size_t                            _M_grouping_size;
03505       bool              _M_use_grouping;
03506       _CharT                _M_decimal_point;
03507       _CharT                _M_thousands_sep;
03508       const _CharT*         _M_curr_symbol;
03509       size_t                            _M_curr_symbol_size;
03510       const _CharT*         _M_positive_sign;
03511       size_t                            _M_positive_sign_size;
03512       const _CharT*         _M_negative_sign;
03513       size_t                            _M_negative_sign_size;
03514       int               _M_frac_digits;
03515       money_base::pattern       _M_pos_format;
03516       money_base::pattern           _M_neg_format;
03517 
03518       // A list of valid numeric literals for input and output: in the standard
03519       // "C" locale, this is "-0123456789". This array contains the chars after
03520       // having been passed through the current locale's ctype<_CharT>.widen().
03521       _CharT                _M_atoms[money_base::_S_end];
03522 
03523       bool              _M_allocated;
03524 
03525       __moneypunct_cache(size_t __refs = 0) : facet(__refs),
03526       _M_grouping(NULL), _M_grouping_size(0), _M_use_grouping(false),
03527       _M_decimal_point(_CharT()), _M_thousands_sep(_CharT()),
03528       _M_curr_symbol(NULL), _M_curr_symbol_size(0),
03529       _M_positive_sign(NULL), _M_positive_sign_size(0),
03530       _M_negative_sign(NULL), _M_negative_sign_size(0),
03531       _M_frac_digits(0),
03532       _M_pos_format(money_base::pattern()),
03533       _M_neg_format(money_base::pattern()), _M_allocated(false)
03534       { }
03535 
03536       ~__moneypunct_cache();
03537 
03538       void
03539       _M_cache(const locale& __loc);
03540 
03541     private:
03542       __moneypunct_cache&
03543       operator=(const __moneypunct_cache&);
03544       
03545       explicit
03546       __moneypunct_cache(const __moneypunct_cache&);
03547     };
03548 
03549   template<typename _CharT, bool _Intl>
03550     __moneypunct_cache<_CharT, _Intl>::~__moneypunct_cache()
03551     {
03552       if (_M_allocated)
03553     {
03554       delete [] _M_grouping;
03555       delete [] _M_curr_symbol;
03556       delete [] _M_positive_sign;
03557       delete [] _M_negative_sign;
03558     }
03559     }
03560 
03567   template<typename _CharT, bool _Intl>
03568     class moneypunct : public locale::facet, public money_base
03569     {
03570     public:
03571       // Types:
03573 
03574       typedef _CharT            char_type;
03575       typedef basic_string<_CharT>  string_type;
03577       typedef __moneypunct_cache<_CharT, _Intl>     __cache_type;
03578 
03579     private:
03580       __cache_type*         _M_data;
03581 
03582     public:
03585       static const bool         intl = _Intl;
03587       static locale::id         id;
03588 
03596       explicit
03597       moneypunct(size_t __refs = 0) : facet(__refs), _M_data(NULL)
03598       { _M_initialize_moneypunct(); }
03599 
03608       explicit
03609       moneypunct(__cache_type* __cache, size_t __refs = 0)
03610       : facet(__refs), _M_data(__cache)
03611       { _M_initialize_moneypunct(); }
03612 
03623       explicit
03624       moneypunct(__c_locale __cloc, const char* __s, size_t __refs = 0)
03625       : facet(__refs), _M_data(NULL)
03626       { _M_initialize_moneypunct(__cloc, __s); }
03627 
03637       char_type
03638       decimal_point() const
03639       { return this->do_decimal_point(); }
03640 
03650       char_type
03651       thousands_sep() const
03652       { return this->do_thousands_sep(); }
03653 
03679       string
03680       grouping() const
03681       { return this->do_grouping(); }
03682 
03692       string_type
03693       curr_symbol() const
03694       { return this->do_curr_symbol(); }
03695 
03709       string_type
03710       positive_sign() const
03711       { return this->do_positive_sign(); }
03712 
03726       string_type
03727       negative_sign() const
03728       { return this->do_negative_sign(); }
03729 
03742       int
03743       frac_digits() const
03744       { return this->do_frac_digits(); }
03745 
03747 
03777       pattern
03778       pos_format() const
03779       { return this->do_pos_format(); }
03780 
03781       pattern
03782       neg_format() const
03783       { return this->do_neg_format(); }
03785 
03786     protected:
03788       virtual
03789       ~moneypunct();
03790 
03799       virtual char_type
03800       do_decimal_point() const
03801       { return _M_data->_M_decimal_point; }
03802 
03811       virtual char_type
03812       do_thousands_sep() const
03813       { return _M_data->_M_thousands_sep; }
03814 
03824       virtual string
03825       do_grouping() const
03826       { return _M_data->_M_grouping; }
03827 
03837       virtual string_type
03838       do_curr_symbol()   const
03839       { return _M_data->_M_curr_symbol; }
03840 
03850       virtual string_type
03851       do_positive_sign() const
03852       { return _M_data->_M_positive_sign; }
03853 
03863       virtual string_type
03864       do_negative_sign() const
03865       { return _M_data->_M_negative_sign; }
03866 
03877       virtual int
03878       do_frac_digits() const
03879       { return _M_data->_M_frac_digits; }
03880 
03891       virtual pattern
03892       do_pos_format() const
03893       { return _M_data->_M_pos_format; }
03894 
03905       virtual pattern
03906       do_neg_format() const
03907       { return _M_data->_M_neg_format; }
03908 
03909       // For use at construction time only.
03910        void
03911        _M_initialize_moneypunct(__c_locale __cloc = NULL,
03912                 const char* __name = NULL);
03913     };
03914 
03915   template<typename _CharT, bool _Intl>
03916     locale::id moneypunct<_CharT, _Intl>::id;
03917 
03918   template<typename _CharT, bool _Intl>
03919     const bool moneypunct<_CharT, _Intl>::intl;
03920 
03921   template<>
03922     moneypunct<char, true>::~moneypunct();
03923 
03924   template<>
03925     moneypunct<char, false>::~moneypunct();
03926 
03927   template<>
03928     void
03929     moneypunct<char, true>::_M_initialize_moneypunct(__c_locale, const char*);
03930 
03931   template<>
03932     void
03933     moneypunct<char, false>::_M_initialize_moneypunct(__c_locale, const char*);
03934 
03935 #ifdef _GLIBCXX_USE_WCHAR_T
03936   template<>
03937     moneypunct<wchar_t, true>::~moneypunct();
03938 
03939   template<>
03940     moneypunct<wchar_t, false>::~moneypunct();
03941 
03942   template<>
03943     void
03944     moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale,
03945                             const char*);
03946 
03947   template<>
03948     void
03949     moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale,
03950                              const char*);
03951 #endif
03952 
03954   template<typename _CharT, bool _Intl>
03955     class moneypunct_byname : public moneypunct<_CharT, _Intl>
03956     {
03957     public:
03958       typedef _CharT            char_type;
03959       typedef basic_string<_CharT>  string_type;
03960 
03961       static const bool intl = _Intl;
03962 
03963       explicit
03964       moneypunct_byname(const char* __s, size_t __refs = 0)
03965       : moneypunct<_CharT, _Intl>(__refs)
03966       {
03967     if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
03968       {
03969         __c_locale __tmp;
03970         this->_S_create_c_locale(__tmp, __s);
03971         this->_M_initialize_moneypunct(__tmp);
03972         this->_S_destroy_c_locale(__tmp);
03973       }
03974       }
03975 
03976     protected:
03977       virtual
03978       ~moneypunct_byname() { }
03979     };
03980 
03981   template<typename _CharT, bool _Intl>
03982     const bool moneypunct_byname<_CharT, _Intl>::intl;
03983 
03984 _GLIBCXX_BEGIN_LDBL_NAMESPACE
03997   template<typename _CharT, typename _InIter>
03998     class money_get : public locale::facet
03999     {
04000     public:
04001       // Types:
04003 
04004       typedef _CharT            char_type;
04005       typedef _InIter           iter_type;
04006       typedef basic_string<_CharT>  string_type;
04008 
04010       static locale::id         id;
04011 
04019       explicit
04020       money_get(size_t __refs = 0) : facet(__refs) { }
04021 
04049       iter_type
04050       get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
04051       ios_base::iostate& __err, long double& __units) const
04052       { return this->do_get(__s, __end, __intl, __io, __err, __units); }
04053 
04079       iter_type
04080       get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
04081       ios_base::iostate& __err, string_type& __digits) const
04082       { return this->do_get(__s, __end, __intl, __io, __err, __digits); }
04083 
04084     protected:
04086       virtual
04087       ~money_get() { }
04088 
04096       // XXX GLIBCXX_ABI Deprecated
04097 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
04098       virtual iter_type
04099       __do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
04100            ios_base::iostate& __err, double& __units) const;
04101 #else
04102       virtual iter_type
04103       do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
04104          ios_base::iostate& __err, long double& __units) const;
04105 #endif
04106 
04114       virtual iter_type
04115       do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
04116          ios_base::iostate& __err, string_type& __digits) const;
04117 
04118       // XXX GLIBCXX_ABI Deprecated
04119 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
04120       virtual iter_type
04121       do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
04122          ios_base::iostate& __err, long double& __units) const;
04123 #endif
04124 
04125       template<bool _Intl>
04126         iter_type
04127         _M_extract(iter_type __s, iter_type __end, ios_base& __io,
04128            ios_base::iostate& __err, string& __digits) const;     
04129     };
04130 
04131   template<typename _CharT, typename _InIter>
04132     locale::id money_get<_CharT, _InIter>::id;
04133 
04146   template<typename _CharT, typename _OutIter>
04147     class money_put : public locale::facet
04148     {
04149     public:
04151 
04152       typedef _CharT            char_type;
04153       typedef _OutIter          iter_type;
04154       typedef basic_string<_CharT>  string_type;
04156 
04158       static locale::id         id;
04159 
04167       explicit
04168       money_put(size_t __refs = 0) : facet(__refs) { }
04169 
04187       iter_type
04188       put(iter_type __s, bool __intl, ios_base& __io,
04189       char_type __fill, long double __units) const
04190       { return this->do_put(__s, __intl, __io, __fill, __units); }
04191 
04209       iter_type
04210       put(iter_type __s, bool __intl, ios_base& __io,
04211       char_type __fill, const string_type& __digits) const
04212       { return this->do_put(__s, __intl, __io, __fill, __digits); }
04213 
04214     protected:
04216       virtual
04217       ~money_put() { }
04218 
04237       // XXX GLIBCXX_ABI Deprecated
04238 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
04239       virtual iter_type
04240       __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
04241            double __units) const;
04242 #else
04243       virtual iter_type
04244       do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
04245          long double __units) const;
04246 #endif
04247 
04266       virtual iter_type
04267       do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
04268          const string_type& __digits) const;
04269 
04270       // XXX GLIBCXX_ABI Deprecated
04271 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
04272       virtual iter_type
04273       do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
04274          long double __units) const;
04275 #endif
04276 
04277       template<bool _Intl>
04278         iter_type
04279         _M_insert(iter_type __s, ios_base& __io, char_type __fill,
04280           const string_type& __digits) const;
04281     };
04282 
04283   template<typename _CharT, typename _OutIter>
04284     locale::id money_put<_CharT, _OutIter>::id;
04285 
04286 _GLIBCXX_END_LDBL_NAMESPACE
04287 
04291   struct messages_base
04292   {
04293     typedef int catalog;
04294   };
04295 
04316   template<typename _CharT>
04317     class messages : public locale::facet, public messages_base
04318     {
04319     public:
04320       // Types:
04322 
04323       typedef _CharT            char_type;
04324       typedef basic_string<_CharT>  string_type;
04326 
04327     protected:
04328       // Underlying "C" library locale information saved from
04329       // initialization, needed by messages_byname as well.
04330       __c_locale            _M_c_locale_messages;
04331       const char*           _M_name_messages;
04332 
04333     public:
04335       static locale::id         id;
04336 
04344       explicit
04345       messages(size_t __refs = 0);
04346 
04347       // Non-standard.
04358       explicit
04359       messages(__c_locale __cloc, const char* __s, size_t __refs = 0);
04360 
04361       /*
04362        *  @brief  Open a message catalog.
04363        *
04364        *  This function opens and returns a handle to a message catalog by
04365        *  returning do_open(s, loc).
04366        *
04367        *  @param  s  The catalog to open.
04368        *  @param  loc  Locale to use for character set conversions.
04369        *  @return  Handle to the catalog or value < 0 if open fails.
04370       */
04371       catalog
04372       open(const basic_string<char>& __s, const locale& __loc) const
04373       { return this->do_open(__s, __loc); }
04374 
04375       // Non-standard and unorthodox, yet effective.
04376       /*
04377        *  @brief  Open a message catalog.
04378        *
04379        *  This non-standard function opens and returns a handle to a message
04380        *  catalog by returning do_open(s, loc).  The third argument provides a
04381        *  message catalog root directory for gnu gettext and is ignored
04382        *  otherwise.
04383        *
04384        *  @param  s  The catalog to open.
04385        *  @param  loc  Locale to use for character set conversions.
04386        *  @param  dir  Message catalog root directory.
04387        *  @return  Handle to the catalog or value < 0 if open fails.
04388       */
04389       catalog
04390       open(const basic_string<char>&, const locale&, const char*) const;
04391 
04392       /*
04393        *  @brief  Look up a string in a message catalog.
04394        *
04395        *  This function retrieves and returns a message from a catalog by
04396        *  returning do_get(c, set, msgid, s).
04397        *
04398        *  For gnu, @a set and @a msgid are ignored.  Returns gettext(s).
04399        *  For default, returns s. For ieee, returns catgets(c,set,msgid,s).
04400        *
04401        *  @param  c  The catalog to access.
04402        *  @param  set  Implementation-defined.
04403        *  @param  msgid  Implementation-defined.
04404        *  @param  s  Default return value if retrieval fails.
04405        *  @return  Retrieved message or @a s if get fails.
04406       */
04407       string_type
04408       get(catalog __c, int __set, int __msgid, const string_type& __s) const
04409       { return this->do_get(__c, __set, __msgid, __s); }
04410 
04411       /*
04412        *  @brief  Close a message catalog.
04413        *
04414        *  Closes catalog @a c by calling do_close(c).
04415        *
04416        *  @param  c  The catalog to close.
04417       */
04418       void
04419       close(catalog __c) const
04420       { return this->do_close(__c); }
04421 
04422     protected:
04424       virtual
04425       ~messages();
04426 
04427       /*
04428        *  @brief  Open a message catalog.
04429        *
04430        *  This function opens and returns a handle to a message catalog in an
04431        *  implementation-defined manner.  This function is a hook for derived
04432        *  classes to change the value returned.
04433        *
04434        *  @param  s  The catalog to open.
04435        *  @param  loc  Locale to use for character set conversions.
04436        *  @return  Handle to the opened catalog, value < 0 if open failed.
04437       */
04438       virtual catalog
04439       do_open(const basic_string<char>&, const locale&) const;
04440 
04441       /*
04442        *  @brief  Look up a string in a message catalog.
04443        *
04444        *  This function retrieves and returns a message from a catalog in an
04445        *  implementation-defined manner.  This function is a hook for derived
04446        *  classes to change the value returned.
04447        *
04448        *  For gnu, @a set and @a msgid are ignored.  Returns gettext(s).
04449        *  For default, returns s. For ieee, returns catgets(c,set,msgid,s).
04450        *
04451        *  @param  c  The catalog to access.
04452        *  @param  set  Implementation-defined.
04453        *  @param  msgid  Implementation-defined.
04454        *  @param  s  Default return value if retrieval fails.
04455        *  @return  Retrieved message or @a s if get fails.
04456       */
04457       virtual string_type
04458       do_get(catalog, int, int, const string_type& __dfault) const;
04459 
04460       /*
04461        *  @brief  Close a message catalog.
04462        *
04463        *  @param  c  The catalog to close.
04464       */
04465       virtual void
04466       do_close(catalog) const;
04467 
04468       // Returns a locale and codeset-converted string, given a char* message.
04469       char*
04470       _M_convert_to_char(const string_type& __msg) const
04471       {
04472     // XXX
04473     return reinterpret_cast<char*>(const_cast<_CharT*>(__msg.c_str()));
04474       }
04475 
04476       // Returns a locale and codeset-converted string, given a char* message.
04477       string_type
04478       _M_convert_from_char(char*) const
04479       {
04480 #if 0
04481     // Length of message string without terminating null.
04482     size_t __len = char_traits<char>::length(__msg) - 1;
04483 
04484     // "everybody can easily convert the string using
04485     // mbsrtowcs/wcsrtombs or with iconv()"
04486 
04487     // Convert char* to _CharT in locale used to open catalog.
04488     // XXX need additional template parameter on messages class for this..
04489     // typedef typename codecvt<char, _CharT, _StateT> __codecvt_type;
04490     typedef typename codecvt<char, _CharT, mbstate_t> __codecvt_type;
04491 
04492     __codecvt_type::state_type __state;
04493     // XXX may need to initialize state.
04494     //initialize_state(__state._M_init());
04495 
04496     char* __from_next;
04497     // XXX what size for this string?
04498     _CharT* __to = static_cast<_CharT*>(__builtin_alloca(__len + 1));
04499     const __codecvt_type& __cvt = use_facet<__codecvt_type>(_M_locale_conv);
04500     __cvt.out(__state, __msg, __msg + __len, __from_next,
04501           __to, __to + __len + 1, __to_next);
04502     return string_type(__to);
04503 #endif
04504 #if 0
04505     typedef ctype<_CharT> __ctype_type;
04506     // const __ctype_type& __cvt = use_facet<__ctype_type>(_M_locale_msg);
04507     const __ctype_type& __cvt = use_facet<__ctype_type>(locale());
04508     // XXX Again, proper length of converted string an issue here.
04509     // For now, assume the converted length is not larger.
04510     _CharT* __dest = static_cast<_CharT*>(__builtin_alloca(__len + 1));
04511     __cvt.widen(__msg, __msg + __len, __dest);
04512     return basic_string<_CharT>(__dest);
04513 #endif
04514     return string_type();
04515       }
04516      };
04517 
04518   template<typename _CharT>
04519     locale::id messages<_CharT>::id;
04520 
04521   // Specializations for required instantiations.
04522   template<>
04523     string
04524     messages<char>::do_get(catalog, int, int, const string&) const;
04525 
04526 #ifdef _GLIBCXX_USE_WCHAR_T
04527   template<>
04528     wstring
04529     messages<wchar_t>::do_get(catalog, int, int, const wstring&) const;
04530 #endif
04531 
04533    template<typename _CharT>
04534     class messages_byname : public messages<_CharT>
04535     {
04536     public:
04537       typedef _CharT            char_type;
04538       typedef basic_string<_CharT>  string_type;
04539 
04540       explicit
04541       messages_byname(const char* __s, size_t __refs = 0);
04542 
04543     protected:
04544       virtual
04545       ~messages_byname()
04546       { }
04547     };
04548 
04549   // Include host and configuration specific messages functions.
04550   #include <bits/messages_members.h>
04551 
04552 
04553   // Subclause convenience interfaces, inlines.
04554   // NB: These are inline because, when used in a loop, some compilers
04555   // can hoist the body out of the loop; then it's just as fast as the
04556   // C is*() function.
04557 
04559   template<typename _CharT>
04560     inline bool
04561     isspace(_CharT __c, const locale& __loc)
04562     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c); }
04563 
04565   template<typename _CharT>
04566     inline bool
04567     isprint(_CharT __c, const locale& __loc)
04568     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c); }
04569 
04571   template<typename _CharT>
04572     inline bool
04573     iscntrl(_CharT __c, const locale& __loc)
04574     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c); }
04575 
04577   template<typename _CharT>
04578     inline bool
04579     isupper(_CharT __c, const locale& __loc)
04580     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c); }
04581 
04583   template<typename _CharT>
04584     inline bool 
04585     islower(_CharT __c, const locale& __loc)
04586     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c); }
04587 
04589   template<typename _CharT>
04590     inline bool
04591     isalpha(_CharT __c, const locale& __loc)
04592     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c); }
04593 
04595   template<typename _CharT>
04596     inline bool
04597     isdigit(_CharT __c, const locale& __loc)
04598     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c); }
04599 
04601   template<typename _CharT>
04602     inline bool
04603     ispunct(_CharT __c, const locale& __loc)
04604     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c); }
04605 
04607   template<typename _CharT>
04608     inline bool
04609     isxdigit(_CharT __c, const locale& __loc)
04610     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c); }
04611 
04613   template<typename _CharT>
04614     inline bool
04615     isalnum(_CharT __c, const locale& __loc)
04616     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c); }
04617 
04619   template<typename _CharT>
04620     inline bool
04621     isgraph(_CharT __c, const locale& __loc)
04622     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c); }
04623 
04625   template<typename _CharT>
04626     inline _CharT
04627     toupper(_CharT __c, const locale& __loc)
04628     { return use_facet<ctype<_CharT> >(__loc).toupper(__c); }
04629 
04631   template<typename _CharT>
04632     inline _CharT
04633     tolower(_CharT __c, const locale& __loc)
04634     { return use_facet<ctype<_CharT> >(__loc).tolower(__c); }
04635 } // namespace std
04636 
04637 #endif

Generated on Tue Feb 2 16:56:13 2010 for GNU C++ STL by  doxygen 1.4.7