OpenCores
URL https://opencores.org/ocsvn/altor32/altor32/trunk

Subversion Repositories altor32

[/] [altor32/] [trunk/] [gcc-x64/] [or1knd-elf/] [or1knd-elf/] [include/] [c++/] [4.8.0/] [bits/] [locale_facets_nonio.h] - Blame information for rev 35

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 35 ultra_embe
// Locale support -*- C++ -*-
2
 
3
// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4
//
5
// This file is part of the GNU ISO C++ Library.  This library is free
6
// software; you can redistribute it and/or modify it under the
7
// terms of the GNU General Public License as published by the
8
// Free Software Foundation; either version 3, or (at your option)
9
// any later version.
10
 
11
// This library is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
// GNU General Public License for more details.
15
 
16
// Under Section 7 of GPL version 3, you are granted additional
17
// permissions described in the GCC Runtime Library Exception, version
18
// 3.1, as published by the Free Software Foundation.
19
 
20
// You should have received a copy of the GNU General Public License and
21
// a copy of the GCC Runtime Library Exception along with this program;
22
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23
// <http://www.gnu.org/licenses/>.
24
 
25
/** @file bits/locale_facets_nonio.h
26
 *  This is an internal header file, included by other library headers.
27
 *  Do not attempt to use it directly. @headername{locale}
28
 */
29
 
30
//
31
// ISO C++ 14882: 22.1  Locales
32
//
33
 
34
#ifndef _LOCALE_FACETS_NONIO_H
35
#define _LOCALE_FACETS_NONIO_H 1
36
 
37
#pragma GCC system_header
38
 
39
#include <ctime>        // For struct tm
40
 
41
namespace std _GLIBCXX_VISIBILITY(default)
42
{
43
_GLIBCXX_BEGIN_NAMESPACE_VERSION
44
 
45
  /**
46
   *  @brief  Time format ordering data.
47
   *  @ingroup locales
48
   *
49
   *  This class provides an enum representing different orderings of
50
   *  time: day, month, and year.
51
  */
52
  class time_base
53
  {
54
  public:
55
    enum dateorder { no_order, dmy, mdy, ymd, ydm };
56
  };
57
 
58
  template<typename _CharT>
59
    struct __timepunct_cache : public locale::facet
60
    {
61
      // List of all known timezones, with GMT first.
62
      static const _CharT*              _S_timezones[14];
63
 
64
      const _CharT*                     _M_date_format;
65
      const _CharT*                     _M_date_era_format;
66
      const _CharT*                     _M_time_format;
67
      const _CharT*                     _M_time_era_format;
68
      const _CharT*                     _M_date_time_format;
69
      const _CharT*                     _M_date_time_era_format;
70
      const _CharT*                     _M_am;
71
      const _CharT*                     _M_pm;
72
      const _CharT*                     _M_am_pm_format;
73
 
74
      // Day names, starting with "C"'s Sunday.
75
      const _CharT*                     _M_day1;
76
      const _CharT*                     _M_day2;
77
      const _CharT*                     _M_day3;
78
      const _CharT*                     _M_day4;
79
      const _CharT*                     _M_day5;
80
      const _CharT*                     _M_day6;
81
      const _CharT*                     _M_day7;
82
 
83
      // Abbreviated day names, starting with "C"'s Sun.
84
      const _CharT*                     _M_aday1;
85
      const _CharT*                     _M_aday2;
86
      const _CharT*                     _M_aday3;
87
      const _CharT*                     _M_aday4;
88
      const _CharT*                     _M_aday5;
89
      const _CharT*                     _M_aday6;
90
      const _CharT*                     _M_aday7;
91
 
92
      // Month names, starting with "C"'s January.
93
      const _CharT*                     _M_month01;
94
      const _CharT*                     _M_month02;
95
      const _CharT*                     _M_month03;
96
      const _CharT*                     _M_month04;
97
      const _CharT*                     _M_month05;
98
      const _CharT*                     _M_month06;
99
      const _CharT*                     _M_month07;
100
      const _CharT*                     _M_month08;
101
      const _CharT*                     _M_month09;
102
      const _CharT*                     _M_month10;
103
      const _CharT*                     _M_month11;
104
      const _CharT*                     _M_month12;
105
 
106
      // Abbreviated month names, starting with "C"'s Jan.
107
      const _CharT*                     _M_amonth01;
108
      const _CharT*                     _M_amonth02;
109
      const _CharT*                     _M_amonth03;
110
      const _CharT*                     _M_amonth04;
111
      const _CharT*                     _M_amonth05;
112
      const _CharT*                     _M_amonth06;
113
      const _CharT*                     _M_amonth07;
114
      const _CharT*                     _M_amonth08;
115
      const _CharT*                     _M_amonth09;
116
      const _CharT*                     _M_amonth10;
117
      const _CharT*                     _M_amonth11;
118
      const _CharT*                     _M_amonth12;
119
 
120
      bool                              _M_allocated;
121
 
122
      __timepunct_cache(size_t __refs = 0) : facet(__refs),
123
      _M_date_format(0), _M_date_era_format(0), _M_time_format(0),
124
      _M_time_era_format(0), _M_date_time_format(0),
125
      _M_date_time_era_format(0), _M_am(0), _M_pm(0),
126
      _M_am_pm_format(0), _M_day1(0), _M_day2(0), _M_day3(0),
127
      _M_day4(0), _M_day5(0), _M_day6(0), _M_day7(0),
128
      _M_aday1(0), _M_aday2(0), _M_aday3(0), _M_aday4(0),
129
      _M_aday5(0), _M_aday6(0), _M_aday7(0), _M_month01(0),
130
      _M_month02(0), _M_month03(0), _M_month04(0), _M_month05(0),
131
      _M_month06(0), _M_month07(0), _M_month08(0), _M_month09(0),
132
      _M_month10(0), _M_month11(0), _M_month12(0), _M_amonth01(0),
133
      _M_amonth02(0), _M_amonth03(0), _M_amonth04(0),
134
      _M_amonth05(0), _M_amonth06(0), _M_amonth07(0),
135
      _M_amonth08(0), _M_amonth09(0), _M_amonth10(0),
136
      _M_amonth11(0), _M_amonth12(0), _M_allocated(false)
137
      { }
138
 
139
      ~__timepunct_cache();
140
 
141
      void
142
      _M_cache(const locale& __loc);
143
 
144
    private:
145
      __timepunct_cache&
146
      operator=(const __timepunct_cache&);
147
 
148
      explicit
149
      __timepunct_cache(const __timepunct_cache&);
150
    };
151
 
152
  template<typename _CharT>
153
    __timepunct_cache<_CharT>::~__timepunct_cache()
154
    {
155
      if (_M_allocated)
156
        {
157
          // Unused.
158
        }
159
    }
160
 
161
  // Specializations.
162
  template<>
163
    const char*
164
    __timepunct_cache<char>::_S_timezones[14];
165
 
166
#ifdef _GLIBCXX_USE_WCHAR_T
167
  template<>
168
    const wchar_t*
169
    __timepunct_cache<wchar_t>::_S_timezones[14];
170
#endif
171
 
172
  // Generic.
173
  template<typename _CharT>
174
    const _CharT* __timepunct_cache<_CharT>::_S_timezones[14];
175
 
176
  template<typename _CharT>
177
    class __timepunct : public locale::facet
178
    {
179
    public:
180
      // Types:
181
      typedef _CharT                    __char_type;
182
      typedef basic_string<_CharT>      __string_type;
183
      typedef __timepunct_cache<_CharT> __cache_type;
184
 
185
    protected:
186
      __cache_type*                     _M_data;
187
      __c_locale                        _M_c_locale_timepunct;
188
      const char*                       _M_name_timepunct;
189
 
190
    public:
191
      /// Numpunct facet id.
192
      static locale::id                 id;
193
 
194
      explicit
195
      __timepunct(size_t __refs = 0);
196
 
197
      explicit
198
      __timepunct(__cache_type* __cache, size_t __refs = 0);
199
 
200
      /**
201
       *  @brief  Internal constructor. Not for general use.
202
       *
203
       *  This is a constructor for use by the library itself to set up new
204
       *  locales.
205
       *
206
       *  @param __cloc  The C locale.
207
       *  @param __s  The name of a locale.
208
       *  @param refs  Passed to the base facet class.
209
      */
210
      explicit
211
      __timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0);
212
 
213
      // FIXME: for error checking purposes _M_put should return the return
214
      // value of strftime/wcsftime.
215
      void
216
      _M_put(_CharT* __s, size_t __maxlen, const _CharT* __format,
217
             const tm* __tm) const throw ();
218
 
219
      void
220
      _M_date_formats(const _CharT** __date) const
221
      {
222
        // Always have default first.
223
        __date[0] = _M_data->_M_date_format;
224
        __date[1] = _M_data->_M_date_era_format;
225
      }
226
 
227
      void
228
      _M_time_formats(const _CharT** __time) const
229
      {
230
        // Always have default first.
231
        __time[0] = _M_data->_M_time_format;
232
        __time[1] = _M_data->_M_time_era_format;
233
      }
234
 
235
      void
236
      _M_date_time_formats(const _CharT** __dt) const
237
      {
238
        // Always have default first.
239
        __dt[0] = _M_data->_M_date_time_format;
240
        __dt[1] = _M_data->_M_date_time_era_format;
241
      }
242
 
243
      void
244
      _M_am_pm_format(const _CharT* __ampm) const
245
      { __ampm = _M_data->_M_am_pm_format; }
246
 
247
      void
248
      _M_am_pm(const _CharT** __ampm) const
249
      {
250
        __ampm[0] = _M_data->_M_am;
251
        __ampm[1] = _M_data->_M_pm;
252
      }
253
 
254
      void
255
      _M_days(const _CharT** __days) const
256
      {
257
        __days[0] = _M_data->_M_day1;
258
        __days[1] = _M_data->_M_day2;
259
        __days[2] = _M_data->_M_day3;
260
        __days[3] = _M_data->_M_day4;
261
        __days[4] = _M_data->_M_day5;
262
        __days[5] = _M_data->_M_day6;
263
        __days[6] = _M_data->_M_day7;
264
      }
265
 
266
      void
267
      _M_days_abbreviated(const _CharT** __days) const
268
      {
269
        __days[0] = _M_data->_M_aday1;
270
        __days[1] = _M_data->_M_aday2;
271
        __days[2] = _M_data->_M_aday3;
272
        __days[3] = _M_data->_M_aday4;
273
        __days[4] = _M_data->_M_aday5;
274
        __days[5] = _M_data->_M_aday6;
275
        __days[6] = _M_data->_M_aday7;
276
      }
277
 
278
      void
279
      _M_months(const _CharT** __months) const
280
      {
281
        __months[0] = _M_data->_M_month01;
282
        __months[1] = _M_data->_M_month02;
283
        __months[2] = _M_data->_M_month03;
284
        __months[3] = _M_data->_M_month04;
285
        __months[4] = _M_data->_M_month05;
286
        __months[5] = _M_data->_M_month06;
287
        __months[6] = _M_data->_M_month07;
288
        __months[7] = _M_data->_M_month08;
289
        __months[8] = _M_data->_M_month09;
290
        __months[9] = _M_data->_M_month10;
291
        __months[10] = _M_data->_M_month11;
292
        __months[11] = _M_data->_M_month12;
293
      }
294
 
295
      void
296
      _M_months_abbreviated(const _CharT** __months) const
297
      {
298
        __months[0] = _M_data->_M_amonth01;
299
        __months[1] = _M_data->_M_amonth02;
300
        __months[2] = _M_data->_M_amonth03;
301
        __months[3] = _M_data->_M_amonth04;
302
        __months[4] = _M_data->_M_amonth05;
303
        __months[5] = _M_data->_M_amonth06;
304
        __months[6] = _M_data->_M_amonth07;
305
        __months[7] = _M_data->_M_amonth08;
306
        __months[8] = _M_data->_M_amonth09;
307
        __months[9] = _M_data->_M_amonth10;
308
        __months[10] = _M_data->_M_amonth11;
309
        __months[11] = _M_data->_M_amonth12;
310
      }
311
 
312
    protected:
313
      virtual
314
      ~__timepunct();
315
 
316
      // For use at construction time only.
317
      void
318
      _M_initialize_timepunct(__c_locale __cloc = 0);
319
    };
320
 
321
  template<typename _CharT>
322
    locale::id __timepunct<_CharT>::id;
323
 
324
  // Specializations.
325
  template<>
326
    void
327
    __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc);
328
 
329
  template<>
330
    void
331
    __timepunct<char>::_M_put(char*, size_t, const char*, const tm*) const throw ();
332
 
333
#ifdef _GLIBCXX_USE_WCHAR_T
334
  template<>
335
    void
336
    __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc);
337
 
338
  template<>
339
    void
340
    __timepunct<wchar_t>::_M_put(wchar_t*, size_t, const wchar_t*,
341
                                 const tm*) const throw ();
342
#endif
343
 
344
_GLIBCXX_END_NAMESPACE_VERSION
345
} // namespace
346
 
347
  // Include host and configuration specific timepunct functions.
348
  #include <bits/time_members.h>
349
 
350
namespace std _GLIBCXX_VISIBILITY(default)
351
{
352
_GLIBCXX_BEGIN_NAMESPACE_VERSION
353
 
354
  /**
355
   *  @brief  Primary class template time_get.
356
   *  @ingroup locales
357
   *
358
   *  This facet encapsulates the code to parse and return a date or
359
   *  time from a string.  It is used by the istream numeric
360
   *  extraction operators.
361
   *
362
   *  The time_get template uses protected virtual functions to provide the
363
   *  actual results.  The public accessors forward the call to the virtual
364
   *  functions.  These virtual functions are hooks for developers to
365
   *  implement the behavior they require from the time_get facet.
366
  */
367
  template<typename _CharT, typename _InIter>
368
    class time_get : public locale::facet, public time_base
369
    {
370
    public:
371
      // Types:
372
      //@{
373
      /// Public typedefs
374
      typedef _CharT                    char_type;
375
      typedef _InIter                   iter_type;
376
      //@}
377
      typedef basic_string<_CharT>      __string_type;
378
 
379
      /// Numpunct facet id.
380
      static locale::id                 id;
381
 
382
      /**
383
       *  @brief  Constructor performs initialization.
384
       *
385
       *  This is the constructor provided by the standard.
386
       *
387
       *  @param __refs  Passed to the base facet class.
388
      */
389
      explicit
390
      time_get(size_t __refs = 0)
391
      : facet (__refs) { }
392
 
393
      /**
394
       *  @brief  Return preferred order of month, day, and year.
395
       *
396
       *  This function returns an enum from timebase::dateorder giving the
397
       *  preferred ordering if the format @a x given to time_put::put() only
398
       *  uses month, day, and year.  If the format @a x for the associated
399
       *  locale uses other fields, this function returns
400
       *  timebase::dateorder::noorder.
401
       *
402
       *  NOTE: The library always returns noorder at the moment.
403
       *
404
       *  @return  A member of timebase::dateorder.
405
      */
406
      dateorder
407
      date_order()  const
408
      { return this->do_date_order(); }
409
 
410
      /**
411
       *  @brief  Parse input time string.
412
       *
413
       *  This function parses a time according to the format @a X and puts the
414
       *  results into a user-supplied struct tm.  The result is returned by
415
       *  calling time_get::do_get_time().
416
       *
417
       *  If there is a valid time string according to format @a X, @a tm will
418
       *  be filled in accordingly and the returned iterator will point to the
419
       *  first character beyond the time string.  If an error occurs before
420
       *  the end, err |= ios_base::failbit.  If parsing reads all the
421
       *  characters, err |= ios_base::eofbit.
422
       *
423
       *  @param  __beg  Start of string to parse.
424
       *  @param  __end  End of string to parse.
425
       *  @param  __io  Source of the locale.
426
       *  @param  __err  Error flags to set.
427
       *  @param  __tm  Pointer to struct tm to fill in.
428
       *  @return  Iterator to first char beyond time string.
429
      */
430
      iter_type
431
      get_time(iter_type __beg, iter_type __end, ios_base& __io,
432
               ios_base::iostate& __err, tm* __tm)  const
433
      { return this->do_get_time(__beg, __end, __io, __err, __tm); }
434
 
435
      /**
436
       *  @brief  Parse input date string.
437
       *
438
       *  This function parses a date according to the format @a x and puts the
439
       *  results into a user-supplied struct tm.  The result is returned by
440
       *  calling time_get::do_get_date().
441
       *
442
       *  If there is a valid date string according to format @a x, @a tm will
443
       *  be filled in accordingly and the returned iterator will point to the
444
       *  first character beyond the date string.  If an error occurs before
445
       *  the end, err |= ios_base::failbit.  If parsing reads all the
446
       *  characters, err |= ios_base::eofbit.
447
       *
448
       *  @param  __beg  Start of string to parse.
449
       *  @param  __end  End of string to parse.
450
       *  @param  __io  Source of the locale.
451
       *  @param  __err  Error flags to set.
452
       *  @param  __tm  Pointer to struct tm to fill in.
453
       *  @return  Iterator to first char beyond date string.
454
      */
455
      iter_type
456
      get_date(iter_type __beg, iter_type __end, ios_base& __io,
457
               ios_base::iostate& __err, tm* __tm)  const
458
      { return this->do_get_date(__beg, __end, __io, __err, __tm); }
459
 
460
      /**
461
       *  @brief  Parse input weekday string.
462
       *
463
       *  This function parses a weekday name and puts the results into a
464
       *  user-supplied struct tm.  The result is returned by calling
465
       *  time_get::do_get_weekday().
466
       *
467
       *  Parsing starts by parsing an abbreviated weekday name.  If a valid
468
       *  abbreviation is followed by a character that would lead to the full
469
       *  weekday name, parsing continues until the full name is found or an
470
       *  error occurs.  Otherwise parsing finishes at the end of the
471
       *  abbreviated name.
472
       *
473
       *  If an error occurs before the end, err |= ios_base::failbit.  If
474
       *  parsing reads all the characters, err |= ios_base::eofbit.
475
       *
476
       *  @param  __beg  Start of string to parse.
477
       *  @param  __end  End of string to parse.
478
       *  @param  __io  Source of the locale.
479
       *  @param  __err  Error flags to set.
480
       *  @param  __tm  Pointer to struct tm to fill in.
481
       *  @return  Iterator to first char beyond weekday name.
482
      */
483
      iter_type
484
      get_weekday(iter_type __beg, iter_type __end, ios_base& __io,
485
                  ios_base::iostate& __err, tm* __tm) const
486
      { return this->do_get_weekday(__beg, __end, __io, __err, __tm); }
487
 
488
      /**
489
       *  @brief  Parse input month string.
490
       *
491
       *  This function parses a month name and puts the results into a
492
       *  user-supplied struct tm.  The result is returned by calling
493
       *  time_get::do_get_monthname().
494
       *
495
       *  Parsing starts by parsing an abbreviated month name.  If a valid
496
       *  abbreviation is followed by a character that would lead to the full
497
       *  month name, parsing continues until the full name is found or an
498
       *  error occurs.  Otherwise parsing finishes at the end of the
499
       *  abbreviated name.
500
       *
501
       *  If an error occurs before the end, err |= ios_base::failbit.  If
502
       *  parsing reads all the characters, err |=
503
       *  ios_base::eofbit.
504
       *
505
       *  @param  __beg  Start of string to parse.
506
       *  @param  __end  End of string to parse.
507
       *  @param  __io  Source of the locale.
508
       *  @param  __err  Error flags to set.
509
       *  @param  __tm  Pointer to struct tm to fill in.
510
       *  @return  Iterator to first char beyond month name.
511
      */
512
      iter_type
513
      get_monthname(iter_type __beg, iter_type __end, ios_base& __io,
514
                    ios_base::iostate& __err, tm* __tm) const
515
      { return this->do_get_monthname(__beg, __end, __io, __err, __tm); }
516
 
517
      /**
518
       *  @brief  Parse input year string.
519
       *
520
       *  This function reads up to 4 characters to parse a year string and
521
       *  puts the results into a user-supplied struct tm.  The result is
522
       *  returned by calling time_get::do_get_year().
523
       *
524
       *  4 consecutive digits are interpreted as a full year.  If there are
525
       *  exactly 2 consecutive digits, the library interprets this as the
526
       *  number of years since 1900.
527
       *
528
       *  If an error occurs before the end, err |= ios_base::failbit.  If
529
       *  parsing reads all the characters, err |= ios_base::eofbit.
530
       *
531
       *  @param  __beg  Start of string to parse.
532
       *  @param  __end  End of string to parse.
533
       *  @param  __io  Source of the locale.
534
       *  @param  __err  Error flags to set.
535
       *  @param  __tm  Pointer to struct tm to fill in.
536
       *  @return  Iterator to first char beyond year.
537
      */
538
      iter_type
539
      get_year(iter_type __beg, iter_type __end, ios_base& __io,
540
               ios_base::iostate& __err, tm* __tm) const
541
      { return this->do_get_year(__beg, __end, __io, __err, __tm); }
542
 
543
    protected:
544
      /// Destructor.
545
      virtual
546
      ~time_get() { }
547
 
548
      /**
549
       *  @brief  Return preferred order of month, day, and year.
550
       *
551
       *  This function returns an enum from timebase::dateorder giving the
552
       *  preferred ordering if the format @a x given to time_put::put() only
553
       *  uses month, day, and year.  This function is a hook for derived
554
       *  classes to change the value returned.
555
       *
556
       *  @return  A member of timebase::dateorder.
557
      */
558
      virtual dateorder
559
      do_date_order() const;
560
 
561
      /**
562
       *  @brief  Parse input time string.
563
       *
564
       *  This function parses a time according to the format @a x and puts the
565
       *  results into a user-supplied struct tm.  This function is a hook for
566
       *  derived classes to change the value returned.  @see get_time() for
567
       *  details.
568
       *
569
       *  @param  __beg  Start of string to parse.
570
       *  @param  __end  End of string to parse.
571
       *  @param  __io  Source of the locale.
572
       *  @param  __err  Error flags to set.
573
       *  @param  __tm  Pointer to struct tm to fill in.
574
       *  @return  Iterator to first char beyond time string.
575
      */
576
      virtual iter_type
577
      do_get_time(iter_type __beg, iter_type __end, ios_base& __io,
578
                  ios_base::iostate& __err, tm* __tm) const;
579
 
580
      /**
581
       *  @brief  Parse input date string.
582
       *
583
       *  This function parses a date according to the format @a X and puts the
584
       *  results into a user-supplied struct tm.  This function is a hook for
585
       *  derived classes to change the value returned.  @see get_date() for
586
       *  details.
587
       *
588
       *  @param  __beg  Start of string to parse.
589
       *  @param  __end  End of string to parse.
590
       *  @param  __io  Source of the locale.
591
       *  @param  __err  Error flags to set.
592
       *  @param  __tm  Pointer to struct tm to fill in.
593
       *  @return  Iterator to first char beyond date string.
594
      */
595
      virtual iter_type
596
      do_get_date(iter_type __beg, iter_type __end, ios_base& __io,
597
                  ios_base::iostate& __err, tm* __tm) const;
598
 
599
      /**
600
       *  @brief  Parse input weekday string.
601
       *
602
       *  This function parses a weekday name and puts the results into a
603
       *  user-supplied struct tm.  This function is a hook for derived
604
       *  classes to change the value returned.  @see get_weekday() for
605
       *  details.
606
       *
607
       *  @param  __beg  Start of string to parse.
608
       *  @param  __end  End of string to parse.
609
       *  @param  __io  Source of the locale.
610
       *  @param  __err  Error flags to set.
611
       *  @param  __tm  Pointer to struct tm to fill in.
612
       *  @return  Iterator to first char beyond weekday name.
613
      */
614
      virtual iter_type
615
      do_get_weekday(iter_type __beg, iter_type __end, ios_base&,
616
                     ios_base::iostate& __err, tm* __tm) const;
617
 
618
      /**
619
       *  @brief  Parse input month string.
620
       *
621
       *  This function parses a month name and puts the results into a
622
       *  user-supplied struct tm.  This function is a hook for derived
623
       *  classes to change the value returned.  @see get_monthname() for
624
       *  details.
625
       *
626
       *  @param  __beg  Start of string to parse.
627
       *  @param  __end  End of string to parse.
628
       *  @param  __io  Source of the locale.
629
       *  @param  __err  Error flags to set.
630
       *  @param  __tm  Pointer to struct tm to fill in.
631
       *  @return  Iterator to first char beyond month name.
632
      */
633
      virtual iter_type
634
      do_get_monthname(iter_type __beg, iter_type __end, ios_base&,
635
                       ios_base::iostate& __err, tm* __tm) const;
636
 
637
      /**
638
       *  @brief  Parse input year string.
639
       *
640
       *  This function reads up to 4 characters to parse a year string and
641
       *  puts the results into a user-supplied struct tm.  This function is a
642
       *  hook for derived classes to change the value returned.  @see
643
       *  get_year() for details.
644
       *
645
       *  @param  __beg  Start of string to parse.
646
       *  @param  __end  End of string to parse.
647
       *  @param  __io  Source of the locale.
648
       *  @param  __err  Error flags to set.
649
       *  @param  __tm  Pointer to struct tm to fill in.
650
       *  @return  Iterator to first char beyond year.
651
      */
652
      virtual iter_type
653
      do_get_year(iter_type __beg, iter_type __end, ios_base& __io,
654
                  ios_base::iostate& __err, tm* __tm) const;
655
 
656
      // Extract numeric component of length __len.
657
      iter_type
658
      _M_extract_num(iter_type __beg, iter_type __end, int& __member,
659
                     int __min, int __max, size_t __len,
660
                     ios_base& __io, ios_base::iostate& __err) const;
661
 
662
      // Extract any unique array of string literals in a const _CharT* array.
663
      iter_type
664
      _M_extract_name(iter_type __beg, iter_type __end, int& __member,
665
                      const _CharT** __names, size_t __indexlen,
666
                      ios_base& __io, ios_base::iostate& __err) const;
667
 
668
      // Extract day or month name in a const _CharT* array.
669
      iter_type
670
      _M_extract_wday_or_month(iter_type __beg, iter_type __end, int& __member,
671
                               const _CharT** __names, size_t __indexlen,
672
                               ios_base& __io, ios_base::iostate& __err) const;
673
 
674
      // Extract on a component-by-component basis, via __format argument.
675
      iter_type
676
      _M_extract_via_format(iter_type __beg, iter_type __end, ios_base& __io,
677
                            ios_base::iostate& __err, tm* __tm,
678
                            const _CharT* __format) const;
679
    };
680
 
681
  template<typename _CharT, typename _InIter>
682
    locale::id time_get<_CharT, _InIter>::id;
683
 
684
  /// class time_get_byname [22.2.5.2].
685
  template<typename _CharT, typename _InIter>
686
    class time_get_byname : public time_get<_CharT, _InIter>
687
    {
688
    public:
689
      // Types:
690
      typedef _CharT                    char_type;
691
      typedef _InIter                   iter_type;
692
 
693
      explicit
694
      time_get_byname(const char*, size_t __refs = 0)
695
      : time_get<_CharT, _InIter>(__refs) { }
696
 
697
    protected:
698
      virtual
699
      ~time_get_byname() { }
700
    };
701
 
702
  /**
703
   *  @brief  Primary class template time_put.
704
   *  @ingroup locales
705
   *
706
   *  This facet encapsulates the code to format and output dates and times
707
   *  according to formats used by strftime().
708
   *
709
   *  The time_put template uses protected virtual functions to provide the
710
   *  actual results.  The public accessors forward the call to the virtual
711
   *  functions.  These virtual functions are hooks for developers to
712
   *  implement the behavior they require from the time_put facet.
713
  */
714
  template<typename _CharT, typename _OutIter>
715
    class time_put : public locale::facet
716
    {
717
    public:
718
      // Types:
719
      //@{
720
      /// Public typedefs
721
      typedef _CharT                    char_type;
722
      typedef _OutIter                  iter_type;
723
      //@}
724
 
725
      /// Numpunct facet id.
726
      static locale::id                 id;
727
 
728
      /**
729
       *  @brief  Constructor performs initialization.
730
       *
731
       *  This is the constructor provided by the standard.
732
       *
733
       *  @param __refs  Passed to the base facet class.
734
      */
735
      explicit
736
      time_put(size_t __refs = 0)
737
      : facet(__refs) { }
738
 
739
      /**
740
       *  @brief  Format and output a time or date.
741
       *
742
       *  This function formats the data in struct tm according to the
743
       *  provided format string.  The format string is interpreted as by
744
       *  strftime().
745
       *
746
       *  @param  __s  The stream to write to.
747
       *  @param  __io  Source of locale.
748
       *  @param  __fill  char_type to use for padding.
749
       *  @param  __tm  Struct tm with date and time info to format.
750
       *  @param  __beg  Start of format string.
751
       *  @param  __end  End of format string.
752
       *  @return  Iterator after writing.
753
       */
754
      iter_type
755
      put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
756
          const _CharT* __beg, const _CharT* __end) const;
757
 
758
      /**
759
       *  @brief  Format and output a time or date.
760
       *
761
       *  This function formats the data in struct tm according to the
762
       *  provided format char and optional modifier.  The format and modifier
763
       *  are interpreted as by strftime().  It does so by returning
764
       *  time_put::do_put().
765
       *
766
       *  @param  __s  The stream to write to.
767
       *  @param  __io  Source of locale.
768
       *  @param  __fill  char_type to use for padding.
769
       *  @param  __tm  Struct tm with date and time info to format.
770
       *  @param  __format  Format char.
771
       *  @param  __mod  Optional modifier char.
772
       *  @return  Iterator after writing.
773
       */
774
      iter_type
775
      put(iter_type __s, ios_base& __io, char_type __fill,
776
          const tm* __tm, char __format, char __mod = 0) const
777
      { return this->do_put(__s, __io, __fill, __tm, __format, __mod); }
778
 
779
    protected:
780
      /// Destructor.
781
      virtual
782
      ~time_put()
783
      { }
784
 
785
      /**
786
       *  @brief  Format and output a time or date.
787
       *
788
       *  This function formats the data in struct tm according to the
789
       *  provided format char and optional modifier.  This function is a hook
790
       *  for derived classes to change the value returned.  @see put() for
791
       *  more details.
792
       *
793
       *  @param  __s  The stream to write to.
794
       *  @param  __io  Source of locale.
795
       *  @param  __fill  char_type to use for padding.
796
       *  @param  __tm  Struct tm with date and time info to format.
797
       *  @param  __format  Format char.
798
       *  @param  __mod  Optional modifier char.
799
       *  @return  Iterator after writing.
800
       */
801
      virtual iter_type
802
      do_put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
803
             char __format, char __mod) const;
804
    };
805
 
806
  template<typename _CharT, typename _OutIter>
807
    locale::id time_put<_CharT, _OutIter>::id;
808
 
809
  /// class time_put_byname [22.2.5.4].
810
  template<typename _CharT, typename _OutIter>
811
    class time_put_byname : public time_put<_CharT, _OutIter>
812
    {
813
    public:
814
      // Types:
815
      typedef _CharT                    char_type;
816
      typedef _OutIter                  iter_type;
817
 
818
      explicit
819
      time_put_byname(const char*, size_t __refs = 0)
820
      : time_put<_CharT, _OutIter>(__refs)
821
      { };
822
 
823
    protected:
824
      virtual
825
      ~time_put_byname() { }
826
    };
827
 
828
 
829
  /**
830
   *  @brief  Money format ordering data.
831
   *  @ingroup locales
832
   *
833
   *  This class contains an ordered array of 4 fields to represent the
834
   *  pattern for formatting a money amount.  Each field may contain one entry
835
   *  from the part enum.  symbol, sign, and value must be present and the
836
   *  remaining field must contain either none or space.  @see
837
   *  moneypunct::pos_format() and moneypunct::neg_format() for details of how
838
   *  these fields are interpreted.
839
  */
840
  class money_base
841
  {
842
  public:
843
    enum part { none, space, symbol, sign, value };
844
    struct pattern { char field[4]; };
845
 
846
    static const pattern _S_default_pattern;
847
 
848
    enum
849
    {
850
      _S_minus,
851
      _S_zero,
852
      _S_end = 11
853
    };
854
 
855
    // String literal of acceptable (narrow) input/output, for
856
    // money_get/money_put. "-0123456789"
857
    static const char* _S_atoms;
858
 
859
    // Construct and return valid pattern consisting of some combination of:
860
    // space none symbol sign value
861
    _GLIBCXX_CONST static pattern
862
    _S_construct_pattern(char __precedes, char __space, char __posn) throw ();
863
  };
864
 
865
  template<typename _CharT, bool _Intl>
866
    struct __moneypunct_cache : public locale::facet
867
    {
868
      const char*                       _M_grouping;
869
      size_t                            _M_grouping_size;
870
      bool                              _M_use_grouping;
871
      _CharT                            _M_decimal_point;
872
      _CharT                            _M_thousands_sep;
873
      const _CharT*                     _M_curr_symbol;
874
      size_t                            _M_curr_symbol_size;
875
      const _CharT*                     _M_positive_sign;
876
      size_t                            _M_positive_sign_size;
877
      const _CharT*                     _M_negative_sign;
878
      size_t                            _M_negative_sign_size;
879
      int                               _M_frac_digits;
880
      money_base::pattern               _M_pos_format;
881
      money_base::pattern               _M_neg_format;
882
 
883
      // A list of valid numeric literals for input and output: in the standard
884
      // "C" locale, this is "-0123456789". This array contains the chars after
885
      // having been passed through the current locale's ctype<_CharT>.widen().
886
      _CharT                            _M_atoms[money_base::_S_end];
887
 
888
      bool                              _M_allocated;
889
 
890
      __moneypunct_cache(size_t __refs = 0) : facet(__refs),
891
      _M_grouping(0), _M_grouping_size(0), _M_use_grouping(false),
892
      _M_decimal_point(_CharT()), _M_thousands_sep(_CharT()),
893
      _M_curr_symbol(0), _M_curr_symbol_size(0),
894
      _M_positive_sign(0), _M_positive_sign_size(0),
895
      _M_negative_sign(0), _M_negative_sign_size(0),
896
      _M_frac_digits(0),
897
      _M_pos_format(money_base::pattern()),
898
      _M_neg_format(money_base::pattern()), _M_allocated(false)
899
      { }
900
 
901
      ~__moneypunct_cache();
902
 
903
      void
904
      _M_cache(const locale& __loc);
905
 
906
    private:
907
      __moneypunct_cache&
908
      operator=(const __moneypunct_cache&);
909
 
910
      explicit
911
      __moneypunct_cache(const __moneypunct_cache&);
912
    };
913
 
914
  template<typename _CharT, bool _Intl>
915
    __moneypunct_cache<_CharT, _Intl>::~__moneypunct_cache()
916
    {
917
      if (_M_allocated)
918
        {
919
          delete [] _M_grouping;
920
          delete [] _M_curr_symbol;
921
          delete [] _M_positive_sign;
922
          delete [] _M_negative_sign;
923
        }
924
    }
925
 
926
  /**
927
   *  @brief  Primary class template moneypunct.
928
   *  @ingroup locales
929
   *
930
   *  This facet encapsulates the punctuation, grouping and other formatting
931
   *  features of money amount string representations.
932
  */
933
  template<typename _CharT, bool _Intl>
934
    class moneypunct : public locale::facet, public money_base
935
    {
936
    public:
937
      // Types:
938
      //@{
939
      /// Public typedefs
940
      typedef _CharT                    char_type;
941
      typedef basic_string<_CharT>      string_type;
942
      //@}
943
      typedef __moneypunct_cache<_CharT, _Intl>     __cache_type;
944
 
945
    private:
946
      __cache_type*                     _M_data;
947
 
948
    public:
949
      /// This value is provided by the standard, but no reason for its
950
      /// existence.
951
      static const bool                 intl = _Intl;
952
      /// Numpunct facet id.
953
      static locale::id                 id;
954
 
955
      /**
956
       *  @brief  Constructor performs initialization.
957
       *
958
       *  This is the constructor provided by the standard.
959
       *
960
       *  @param __refs  Passed to the base facet class.
961
      */
962
      explicit
963
      moneypunct(size_t __refs = 0)
964
      : facet(__refs), _M_data(0)
965
      { _M_initialize_moneypunct(); }
966
 
967
      /**
968
       *  @brief  Constructor performs initialization.
969
       *
970
       *  This is an internal constructor.
971
       *
972
       *  @param __cache  Cache for optimization.
973
       *  @param __refs  Passed to the base facet class.
974
      */
975
      explicit
976
      moneypunct(__cache_type* __cache, size_t __refs = 0)
977
      : facet(__refs), _M_data(__cache)
978
      { _M_initialize_moneypunct(); }
979
 
980
      /**
981
       *  @brief  Internal constructor. Not for general use.
982
       *
983
       *  This is a constructor for use by the library itself to set up new
984
       *  locales.
985
       *
986
       *  @param __cloc  The C locale.
987
       *  @param __s  The name of a locale.
988
       *  @param __refs  Passed to the base facet class.
989
      */
990
      explicit
991
      moneypunct(__c_locale __cloc, const char* __s, size_t __refs = 0)
992
      : facet(__refs), _M_data(0)
993
      { _M_initialize_moneypunct(__cloc, __s); }
994
 
995
      /**
996
       *  @brief  Return decimal point character.
997
       *
998
       *  This function returns a char_type to use as a decimal point.  It
999
       *  does so by returning returning
1000
       *  moneypunct<char_type>::do_decimal_point().
1001
       *
1002
       *  @return  @a char_type representing a decimal point.
1003
      */
1004
      char_type
1005
      decimal_point() const
1006
      { return this->do_decimal_point(); }
1007
 
1008
      /**
1009
       *  @brief  Return thousands separator character.
1010
       *
1011
       *  This function returns a char_type to use as a thousands
1012
       *  separator.  It does so by returning returning
1013
       *  moneypunct<char_type>::do_thousands_sep().
1014
       *
1015
       *  @return  char_type representing a thousands separator.
1016
      */
1017
      char_type
1018
      thousands_sep() const
1019
      { return this->do_thousands_sep(); }
1020
 
1021
      /**
1022
       *  @brief  Return grouping specification.
1023
       *
1024
       *  This function returns a string representing groupings for the
1025
       *  integer part of an amount.  Groupings indicate where thousands
1026
       *  separators should be inserted.
1027
       *
1028
       *  Each char in the return string is interpret as an integer rather
1029
       *  than a character.  These numbers represent the number of digits in a
1030
       *  group.  The first char in the string represents the number of digits
1031
       *  in the least significant group.  If a char is negative, it indicates
1032
       *  an unlimited number of digits for the group.  If more chars from the
1033
       *  string are required to group a number, the last char is used
1034
       *  repeatedly.
1035
       *
1036
       *  For example, if the grouping() returns <code>\003\002</code>
1037
       *  and is applied to the number 123456789, this corresponds to
1038
       *  12,34,56,789.  Note that if the string was <code>32</code>, this would
1039
       *  put more than 50 digits into the least significant group if
1040
       *  the character set is ASCII.
1041
       *
1042
       *  The string is returned by calling
1043
       *  moneypunct<char_type>::do_grouping().
1044
       *
1045
       *  @return  string representing grouping specification.
1046
      */
1047
      string
1048
      grouping() const
1049
      { return this->do_grouping(); }
1050
 
1051
      /**
1052
       *  @brief  Return currency symbol string.
1053
       *
1054
       *  This function returns a string_type to use as a currency symbol.  It
1055
       *  does so by returning returning
1056
       *  moneypunct<char_type>::do_curr_symbol().
1057
       *
1058
       *  @return  @a string_type representing a currency symbol.
1059
      */
1060
      string_type
1061
      curr_symbol() const
1062
      { return this->do_curr_symbol(); }
1063
 
1064
      /**
1065
       *  @brief  Return positive sign string.
1066
       *
1067
       *  This function returns a string_type to use as a sign for positive
1068
       *  amounts.  It does so by returning returning
1069
       *  moneypunct<char_type>::do_positive_sign().
1070
       *
1071
       *  If the return value contains more than one character, the first
1072
       *  character appears in the position indicated by pos_format() and the
1073
       *  remainder appear at the end of the formatted string.
1074
       *
1075
       *  @return  @a string_type representing a positive sign.
1076
      */
1077
      string_type
1078
      positive_sign() const
1079
      { return this->do_positive_sign(); }
1080
 
1081
      /**
1082
       *  @brief  Return negative sign string.
1083
       *
1084
       *  This function returns a string_type to use as a sign for negative
1085
       *  amounts.  It does so by returning returning
1086
       *  moneypunct<char_type>::do_negative_sign().
1087
       *
1088
       *  If the return value contains more than one character, the first
1089
       *  character appears in the position indicated by neg_format() and the
1090
       *  remainder appear at the end of the formatted string.
1091
       *
1092
       *  @return  @a string_type representing a negative sign.
1093
      */
1094
      string_type
1095
      negative_sign() const
1096
      { return this->do_negative_sign(); }
1097
 
1098
      /**
1099
       *  @brief  Return number of digits in fraction.
1100
       *
1101
       *  This function returns the exact number of digits that make up the
1102
       *  fractional part of a money amount.  It does so by returning
1103
       *  returning moneypunct<char_type>::do_frac_digits().
1104
       *
1105
       *  The fractional part of a money amount is optional.  But if it is
1106
       *  present, there must be frac_digits() digits.
1107
       *
1108
       *  @return  Number of digits in amount fraction.
1109
      */
1110
      int
1111
      frac_digits() const
1112
      { return this->do_frac_digits(); }
1113
 
1114
      //@{
1115
      /**
1116
       *  @brief  Return pattern for money values.
1117
       *
1118
       *  This function returns a pattern describing the formatting of a
1119
       *  positive or negative valued money amount.  It does so by returning
1120
       *  returning moneypunct<char_type>::do_pos_format() or
1121
       *  moneypunct<char_type>::do_neg_format().
1122
       *
1123
       *  The pattern has 4 fields describing the ordering of symbol, sign,
1124
       *  value, and none or space.  There must be one of each in the pattern.
1125
       *  The none and space enums may not appear in the first field and space
1126
       *  may not appear in the final field.
1127
       *
1128
       *  The parts of a money string must appear in the order indicated by
1129
       *  the fields of the pattern.  The symbol field indicates that the
1130
       *  value of curr_symbol() may be present.  The sign field indicates
1131
       *  that the value of positive_sign() or negative_sign() must be
1132
       *  present.  The value field indicates that the absolute value of the
1133
       *  money amount is present.  none indicates 0 or more whitespace
1134
       *  characters, except at the end, where it permits no whitespace.
1135
       *  space indicates that 1 or more whitespace characters must be
1136
       *  present.
1137
       *
1138
       *  For example, for the US locale and pos_format() pattern
1139
       *  {symbol,sign,value,none}, curr_symbol() == &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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.