1// Locale support -*- C++ -*-
2
3// Copyright (C) 2007-2014 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
41namespace 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
350namespace 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