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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [libstdc++-v3/] [include/] [bits/] [locale_facets_nonio.h] - Blame information for rev 424

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 424 jeremybenn
// Locale support -*- C++ -*-
2
 
3
// Copyright (C) 2007, 2008, 2009, 2010 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 locale_facets_nonio.h
26
 *  This is an internal header file, included by other library headers.
27
 *  You should not attempt to use it directly.
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
_GLIBCXX_BEGIN_NAMESPACE(std)
42
 
43
  /**
44
   *  @brief  Time format ordering data.
45
   *  @ingroup locales
46
   *
47
   *  This class provides an enum representing different orderings of
48
   *  time: day, month, and year.
49
  */
50
  class time_base
51
  {
52
  public:
53
    enum dateorder { no_order, dmy, mdy, ymd, ydm };
54
  };
55
 
56
  template<typename _CharT>
57
    struct __timepunct_cache : public locale::facet
58
    {
59
      // List of all known timezones, with GMT first.
60
      static const _CharT*              _S_timezones[14];
61
 
62
      const _CharT*                     _M_date_format;
63
      const _CharT*                     _M_date_era_format;
64
      const _CharT*                     _M_time_format;
65
      const _CharT*                     _M_time_era_format;
66
      const _CharT*                     _M_date_time_format;
67
      const _CharT*                     _M_date_time_era_format;
68
      const _CharT*                     _M_am;
69
      const _CharT*                     _M_pm;
70
      const _CharT*                     _M_am_pm_format;
71
 
72
      // Day names, starting with "C"'s Sunday.
73
      const _CharT*                     _M_day1;
74
      const _CharT*                     _M_day2;
75
      const _CharT*                     _M_day3;
76
      const _CharT*                     _M_day4;
77
      const _CharT*                     _M_day5;
78
      const _CharT*                     _M_day6;
79
      const _CharT*                     _M_day7;
80
 
81
      // Abbreviated day names, starting with "C"'s Sun.
82
      const _CharT*                     _M_aday1;
83
      const _CharT*                     _M_aday2;
84
      const _CharT*                     _M_aday3;
85
      const _CharT*                     _M_aday4;
86
      const _CharT*                     _M_aday5;
87
      const _CharT*                     _M_aday6;
88
      const _CharT*                     _M_aday7;
89
 
90
      // Month names, starting with "C"'s January.
91
      const _CharT*                     _M_month01;
92
      const _CharT*                     _M_month02;
93
      const _CharT*                     _M_month03;
94
      const _CharT*                     _M_month04;
95
      const _CharT*                     _M_month05;
96
      const _CharT*                     _M_month06;
97
      const _CharT*                     _M_month07;
98
      const _CharT*                     _M_month08;
99
      const _CharT*                     _M_month09;
100
      const _CharT*                     _M_month10;
101
      const _CharT*                     _M_month11;
102
      const _CharT*                     _M_month12;
103
 
104
      // Abbreviated month names, starting with "C"'s Jan.
105
      const _CharT*                     _M_amonth01;
106
      const _CharT*                     _M_amonth02;
107
      const _CharT*                     _M_amonth03;
108
      const _CharT*                     _M_amonth04;
109
      const _CharT*                     _M_amonth05;
110
      const _CharT*                     _M_amonth06;
111
      const _CharT*                     _M_amonth07;
112
      const _CharT*                     _M_amonth08;
113
      const _CharT*                     _M_amonth09;
114
      const _CharT*                     _M_amonth10;
115
      const _CharT*                     _M_amonth11;
116
      const _CharT*                     _M_amonth12;
117
 
118
      bool                              _M_allocated;
119
 
120
      __timepunct_cache(size_t __refs = 0) : facet(__refs),
121
      _M_date_format(NULL), _M_date_era_format(NULL), _M_time_format(NULL),
122
      _M_time_era_format(NULL), _M_date_time_format(NULL),
123
      _M_date_time_era_format(NULL), _M_am(NULL), _M_pm(NULL),
124
      _M_am_pm_format(NULL), _M_day1(NULL), _M_day2(NULL), _M_day3(NULL),
125
      _M_day4(NULL), _M_day5(NULL), _M_day6(NULL), _M_day7(NULL),
126
      _M_aday1(NULL), _M_aday2(NULL), _M_aday3(NULL), _M_aday4(NULL),
127
      _M_aday5(NULL), _M_aday6(NULL), _M_aday7(NULL), _M_month01(NULL),
128
      _M_month02(NULL), _M_month03(NULL), _M_month04(NULL), _M_month05(NULL),
129
      _M_month06(NULL), _M_month07(NULL), _M_month08(NULL), _M_month09(NULL),
130
      _M_month10(NULL), _M_month11(NULL), _M_month12(NULL), _M_amonth01(NULL),
131
      _M_amonth02(NULL), _M_amonth03(NULL), _M_amonth04(NULL),
132
      _M_amonth05(NULL), _M_amonth06(NULL), _M_amonth07(NULL),
133
      _M_amonth08(NULL), _M_amonth09(NULL), _M_amonth10(NULL),
134
      _M_amonth11(NULL), _M_amonth12(NULL), _M_allocated(false)
135
      { }
136
 
137
      ~__timepunct_cache();
138
 
139
      void
140
      _M_cache(const locale& __loc);
141
 
142
    private:
143
      __timepunct_cache&
144
      operator=(const __timepunct_cache&);
145
 
146
      explicit
147
      __timepunct_cache(const __timepunct_cache&);
148
    };
149
 
150
  template<typename _CharT>
151
    __timepunct_cache<_CharT>::~__timepunct_cache()
152
    {
153
      if (_M_allocated)
154
        {
155
          // Unused.
156
        }
157
    }
158
 
159
  // Specializations.
160
  template<>
161
    const char*
162
    __timepunct_cache<char>::_S_timezones[14];
163
 
164
#ifdef _GLIBCXX_USE_WCHAR_T
165
  template<>
166
    const wchar_t*
167
    __timepunct_cache<wchar_t>::_S_timezones[14];
168
#endif
169
 
170
  // Generic.
171
  template<typename _CharT>
172
    const _CharT* __timepunct_cache<_CharT>::_S_timezones[14];
173
 
174
  template<typename _CharT>
175
    class __timepunct : public locale::facet
176
    {
177
    public:
178
      // Types:
179
      typedef _CharT                    __char_type;
180
      typedef basic_string<_CharT>      __string_type;
181
      typedef __timepunct_cache<_CharT> __cache_type;
182
 
183
    protected:
184
      __cache_type*                     _M_data;
185
      __c_locale                        _M_c_locale_timepunct;
186
      const char*                       _M_name_timepunct;
187
 
188
    public:
189
      /// Numpunct facet id.
190
      static locale::id                 id;
191
 
192
      explicit
193
      __timepunct(size_t __refs = 0);
194
 
195
      explicit
196
      __timepunct(__cache_type* __cache, size_t __refs = 0);
197
 
198
      /**
199
       *  @brief  Internal constructor. Not for general use.
200
       *
201
       *  This is a constructor for use by the library itself to set up new
202
       *  locales.
203
       *
204
       *  @param cloc  The C locale.
205
       *  @param s  The name of a locale.
206
       *  @param refs  Passed to the base facet class.
207
      */
208
      explicit
209
      __timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0);
210
 
211
      // FIXME: for error checking purposes _M_put should return the return
212
      // value of strftime/wcsftime.
213
      void
214
      _M_put(_CharT* __s, size_t __maxlen, const _CharT* __format,
215
             const tm* __tm) const throw ();
216
 
217
      void
218
      _M_date_formats(const _CharT** __date) const
219
      {
220
        // Always have default first.
221
        __date[0] = _M_data->_M_date_format;
222
        __date[1] = _M_data->_M_date_era_format;
223
      }
224
 
225
      void
226
      _M_time_formats(const _CharT** __time) const
227
      {
228
        // Always have default first.
229
        __time[0] = _M_data->_M_time_format;
230
        __time[1] = _M_data->_M_time_era_format;
231
      }
232
 
233
      void
234
      _M_date_time_formats(const _CharT** __dt) const
235
      {
236
        // Always have default first.
237
        __dt[0] = _M_data->_M_date_time_format;
238
        __dt[1] = _M_data->_M_date_time_era_format;
239
      }
240
 
241
      void
242
      _M_am_pm_format(const _CharT* __ampm) const
243
      { __ampm = _M_data->_M_am_pm_format; }
244
 
245
      void
246
      _M_am_pm(const _CharT** __ampm) const
247
      {
248
        __ampm[0] = _M_data->_M_am;
249
        __ampm[1] = _M_data->_M_pm;
250
      }
251
 
252
      void
253
      _M_days(const _CharT** __days) const
254
      {
255
        __days[0] = _M_data->_M_day1;
256
        __days[1] = _M_data->_M_day2;
257
        __days[2] = _M_data->_M_day3;
258
        __days[3] = _M_data->_M_day4;
259
        __days[4] = _M_data->_M_day5;
260
        __days[5] = _M_data->_M_day6;
261
        __days[6] = _M_data->_M_day7;
262
      }
263
 
264
      void
265
      _M_days_abbreviated(const _CharT** __days) const
266
      {
267
        __days[0] = _M_data->_M_aday1;
268
        __days[1] = _M_data->_M_aday2;
269
        __days[2] = _M_data->_M_aday3;
270
        __days[3] = _M_data->_M_aday4;
271
        __days[4] = _M_data->_M_aday5;
272
        __days[5] = _M_data->_M_aday6;
273
        __days[6] = _M_data->_M_aday7;
274
      }
275
 
276
      void
277
      _M_months(const _CharT** __months) const
278
      {
279
        __months[0] = _M_data->_M_month01;
280
        __months[1] = _M_data->_M_month02;
281
        __months[2] = _M_data->_M_month03;
282
        __months[3] = _M_data->_M_month04;
283
        __months[4] = _M_data->_M_month05;
284
        __months[5] = _M_data->_M_month06;
285
        __months[6] = _M_data->_M_month07;
286
        __months[7] = _M_data->_M_month08;
287
        __months[8] = _M_data->_M_month09;
288
        __months[9] = _M_data->_M_month10;
289
        __months[10] = _M_data->_M_month11;
290
        __months[11] = _M_data->_M_month12;
291
      }
292
 
293
      void
294
      _M_months_abbreviated(const _CharT** __months) const
295
      {
296
        __months[0] = _M_data->_M_amonth01;
297
        __months[1] = _M_data->_M_amonth02;
298
        __months[2] = _M_data->_M_amonth03;
299
        __months[3] = _M_data->_M_amonth04;
300
        __months[4] = _M_data->_M_amonth05;
301
        __months[5] = _M_data->_M_amonth06;
302
        __months[6] = _M_data->_M_amonth07;
303
        __months[7] = _M_data->_M_amonth08;
304
        __months[8] = _M_data->_M_amonth09;
305
        __months[9] = _M_data->_M_amonth10;
306
        __months[10] = _M_data->_M_amonth11;
307
        __months[11] = _M_data->_M_amonth12;
308
      }
309
 
310
    protected:
311
      virtual
312
      ~__timepunct();
313
 
314
      // For use at construction time only.
315
      void
316
      _M_initialize_timepunct(__c_locale __cloc = NULL);
317
    };
318
 
319
  template<typename _CharT>
320
    locale::id __timepunct<_CharT>::id;
321
 
322
  // Specializations.
323
  template<>
324
    void
325
    __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc);
326
 
327
  template<>
328
    void
329
    __timepunct<char>::_M_put(char*, size_t, const char*, const tm*) const throw ();
330
 
331
#ifdef _GLIBCXX_USE_WCHAR_T
332
  template<>
333
    void
334
    __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc);
335
 
336
  template<>
337
    void
338
    __timepunct<wchar_t>::_M_put(wchar_t*, size_t, const wchar_t*,
339
                                 const tm*) const throw ();
340
#endif
341
 
342
_GLIBCXX_END_NAMESPACE
343
 
344
  // Include host and configuration specific timepunct functions.
345
  #include <bits/time_members.h>
346
 
347
_GLIBCXX_BEGIN_NAMESPACE(std)
348
 
349
  /**
350
   *  @brief  Primary class template time_get.
351
   *  @ingroup locales
352
   *
353
   *  This facet encapsulates the code to parse and return a date or
354
   *  time from a string.  It is used by the istream numeric
355
   *  extraction operators.
356
   *
357
   *  The time_get template uses protected virtual functions to provide the
358
   *  actual results.  The public accessors forward the call to the virtual
359
   *  functions.  These virtual functions are hooks for developers to
360
   *  implement the behavior they require from the time_get facet.
361
  */
362
  template<typename _CharT, typename _InIter>
363
    class time_get : public locale::facet, public time_base
364
    {
365
    public:
366
      // Types:
367
      //@{
368
      /// Public typedefs
369
      typedef _CharT                    char_type;
370
      typedef _InIter                   iter_type;
371
      //@}
372
      typedef basic_string<_CharT>      __string_type;
373
 
374
      /// Numpunct facet id.
375
      static locale::id                 id;
376
 
377
      /**
378
       *  @brief  Constructor performs initialization.
379
       *
380
       *  This is the constructor provided by the standard.
381
       *
382
       *  @param refs  Passed to the base facet class.
383
      */
384
      explicit
385
      time_get(size_t __refs = 0)
386
      : facet (__refs) { }
387
 
388
      /**
389
       *  @brief  Return preferred order of month, day, and year.
390
       *
391
       *  This function returns an enum from timebase::dateorder giving the
392
       *  preferred ordering if the format @a x given to time_put::put() only
393
       *  uses month, day, and year.  If the format @a x for the associated
394
       *  locale uses other fields, this function returns
395
       *  timebase::dateorder::noorder.
396
       *
397
       *  NOTE: The library always returns noorder at the moment.
398
       *
399
       *  @return  A member of timebase::dateorder.
400
      */
401
      dateorder
402
      date_order()  const
403
      { return this->do_date_order(); }
404
 
405
      /**
406
       *  @brief  Parse input time string.
407
       *
408
       *  This function parses a time according to the format @a x and puts the
409
       *  results into a user-supplied struct tm.  The result is returned by
410
       *  calling time_get::do_get_time().
411
       *
412
       *  If there is a valid time string according to format @a x, @a tm will
413
       *  be filled in accordingly and the returned iterator will point to the
414
       *  first character beyond the time string.  If an error occurs before
415
       *  the end, err |= ios_base::failbit.  If parsing reads all the
416
       *  characters, err |= ios_base::eofbit.
417
       *
418
       *  @param  beg  Start of string to parse.
419
       *  @param  end  End of string to parse.
420
       *  @param  io  Source of the locale.
421
       *  @param  err  Error flags to set.
422
       *  @param  tm  Pointer to struct tm to fill in.
423
       *  @return  Iterator to first char beyond time string.
424
      */
425
      iter_type
426
      get_time(iter_type __beg, iter_type __end, ios_base& __io,
427
               ios_base::iostate& __err, tm* __tm)  const
428
      { return this->do_get_time(__beg, __end, __io, __err, __tm); }
429
 
430
      /**
431
       *  @brief  Parse input date string.
432
       *
433
       *  This function parses a date according to the format @a X and puts the
434
       *  results into a user-supplied struct tm.  The result is returned by
435
       *  calling time_get::do_get_date().
436
       *
437
       *  If there is a valid date string according to format @a X, @a tm will
438
       *  be filled in accordingly and the returned iterator will point to the
439
       *  first character beyond the date string.  If an error occurs before
440
       *  the end, err |= ios_base::failbit.  If parsing reads all the
441
       *  characters, err |= ios_base::eofbit.
442
       *
443
       *  @param  beg  Start of string to parse.
444
       *  @param  end  End of string to parse.
445
       *  @param  io  Source of the locale.
446
       *  @param  err  Error flags to set.
447
       *  @param  tm  Pointer to struct tm to fill in.
448
       *  @return  Iterator to first char beyond date string.
449
      */
450
      iter_type
451
      get_date(iter_type __beg, iter_type __end, ios_base& __io,
452
               ios_base::iostate& __err, tm* __tm)  const
453
      { return this->do_get_date(__beg, __end, __io, __err, __tm); }
454
 
455
      /**
456
       *  @brief  Parse input weekday string.
457
       *
458
       *  This function parses a weekday name and puts the results into a
459
       *  user-supplied struct tm.  The result is returned by calling
460
       *  time_get::do_get_weekday().
461
       *
462
       *  Parsing starts by parsing an abbreviated weekday name.  If a valid
463
       *  abbreviation is followed by a character that would lead to the full
464
       *  weekday name, parsing continues until the full name is found or an
465
       *  error occurs.  Otherwise parsing finishes at the end of the
466
       *  abbreviated name.
467
       *
468
       *  If an error occurs before the end, err |= ios_base::failbit.  If
469
       *  parsing reads all the characters, err |= ios_base::eofbit.
470
       *
471
       *  @param  beg  Start of string to parse.
472
       *  @param  end  End of string to parse.
473
       *  @param  io  Source of the locale.
474
       *  @param  err  Error flags to set.
475
       *  @param  tm  Pointer to struct tm to fill in.
476
       *  @return  Iterator to first char beyond weekday name.
477
      */
478
      iter_type
479
      get_weekday(iter_type __beg, iter_type __end, ios_base& __io,
480
                  ios_base::iostate& __err, tm* __tm) const
481
      { return this->do_get_weekday(__beg, __end, __io, __err, __tm); }
482
 
483
      /**
484
       *  @brief  Parse input month string.
485
       *
486
       *  This function parses a month name and puts the results into a
487
       *  user-supplied struct tm.  The result is returned by calling
488
       *  time_get::do_get_monthname().
489
       *
490
       *  Parsing starts by parsing an abbreviated month name.  If a valid
491
       *  abbreviation is followed by a character that would lead to the full
492
       *  month name, parsing continues until the full name is found or an
493
       *  error occurs.  Otherwise parsing finishes at the end of the
494
       *  abbreviated name.
495
       *
496
       *  If an error occurs before the end, err |= ios_base::failbit.  If
497
       *  parsing reads all the characters, err |=
498
       *  ios_base::eofbit.
499
       *
500
       *  @param  beg  Start of string to parse.
501
       *  @param  end  End of string to parse.
502
       *  @param  io  Source of the locale.
503
       *  @param  err  Error flags to set.
504
       *  @param  tm  Pointer to struct tm to fill in.
505
       *  @return  Iterator to first char beyond month name.
506
      */
507
      iter_type
508
      get_monthname(iter_type __beg, iter_type __end, ios_base& __io,
509
                    ios_base::iostate& __err, tm* __tm) const
510
      { return this->do_get_monthname(__beg, __end, __io, __err, __tm); }
511
 
512
      /**
513
       *  @brief  Parse input year string.
514
       *
515
       *  This function reads up to 4 characters to parse a year string and
516
       *  puts the results into a user-supplied struct tm.  The result is
517
       *  returned by calling time_get::do_get_year().
518
       *
519
       *  4 consecutive digits are interpreted as a full year.  If there are
520
       *  exactly 2 consecutive digits, the library interprets this as the
521
       *  number of years since 1900.
522
       *
523
       *  If an error occurs before the end, err |= ios_base::failbit.  If
524
       *  parsing reads all the characters, err |= ios_base::eofbit.
525
       *
526
       *  @param  beg  Start of string to parse.
527
       *  @param  end  End of string to parse.
528
       *  @param  io  Source of the locale.
529
       *  @param  err  Error flags to set.
530
       *  @param  tm  Pointer to struct tm to fill in.
531
       *  @return  Iterator to first char beyond year.
532
      */
533
      iter_type
534
      get_year(iter_type __beg, iter_type __end, ios_base& __io,
535
               ios_base::iostate& __err, tm* __tm) const
536
      { return this->do_get_year(__beg, __end, __io, __err, __tm); }
537
 
538
    protected:
539
      /// Destructor.
540
      virtual
541
      ~time_get() { }
542
 
543
      /**
544
       *  @brief  Return preferred order of month, day, and year.
545
       *
546
       *  This function returns an enum from timebase::dateorder giving the
547
       *  preferred ordering if the format @a x given to time_put::put() only
548
       *  uses month, day, and year.  This function is a hook for derived
549
       *  classes to change the value returned.
550
       *
551
       *  @return  A member of timebase::dateorder.
552
      */
553
      virtual dateorder
554
      do_date_order() const;
555
 
556
      /**
557
       *  @brief  Parse input time string.
558
       *
559
       *  This function parses a time according to the format @a x and puts the
560
       *  results into a user-supplied struct tm.  This function is a hook for
561
       *  derived classes to change the value returned.  @see get_time() for
562
       *  details.
563
       *
564
       *  @param  beg  Start of string to parse.
565
       *  @param  end  End of string to parse.
566
       *  @param  io  Source of the locale.
567
       *  @param  err  Error flags to set.
568
       *  @param  tm  Pointer to struct tm to fill in.
569
       *  @return  Iterator to first char beyond time string.
570
      */
571
      virtual iter_type
572
      do_get_time(iter_type __beg, iter_type __end, ios_base& __io,
573
                  ios_base::iostate& __err, tm* __tm) const;
574
 
575
      /**
576
       *  @brief  Parse input date string.
577
       *
578
       *  This function parses a date according to the format @a X and puts the
579
       *  results into a user-supplied struct tm.  This function is a hook for
580
       *  derived classes to change the value returned.  @see get_date() for
581
       *  details.
582
       *
583
       *  @param  beg  Start of string to parse.
584
       *  @param  end  End of string to parse.
585
       *  @param  io  Source of the locale.
586
       *  @param  err  Error flags to set.
587
       *  @param  tm  Pointer to struct tm to fill in.
588
       *  @return  Iterator to first char beyond date string.
589
      */
590
      virtual iter_type
591
      do_get_date(iter_type __beg, iter_type __end, ios_base& __io,
592
                  ios_base::iostate& __err, tm* __tm) const;
593
 
594
      /**
595
       *  @brief  Parse input weekday string.
596
       *
597
       *  This function parses a weekday name and puts the results into a
598
       *  user-supplied struct tm.  This function is a hook for derived
599
       *  classes to change the value returned.  @see get_weekday() for
600
       *  details.
601
       *
602
       *  @param  beg  Start of string to parse.
603
       *  @param  end  End of string to parse.
604
       *  @param  io  Source of the locale.
605
       *  @param  err  Error flags to set.
606
       *  @param  tm  Pointer to struct tm to fill in.
607
       *  @return  Iterator to first char beyond weekday name.
608
      */
609
      virtual iter_type
610
      do_get_weekday(iter_type __beg, iter_type __end, ios_base&,
611
                     ios_base::iostate& __err, tm* __tm) const;
612
 
613
      /**
614
       *  @brief  Parse input month string.
615
       *
616
       *  This function parses a month name and puts the results into a
617
       *  user-supplied struct tm.  This function is a hook for derived
618
       *  classes to change the value returned.  @see get_monthname() for
619
       *  details.
620
       *
621
       *  @param  beg  Start of string to parse.
622
       *  @param  end  End of string to parse.
623
       *  @param  io  Source of the locale.
624
       *  @param  err  Error flags to set.
625
       *  @param  tm  Pointer to struct tm to fill in.
626
       *  @return  Iterator to first char beyond month name.
627
      */
628
      virtual iter_type
629
      do_get_monthname(iter_type __beg, iter_type __end, ios_base&,
630
                       ios_base::iostate& __err, tm* __tm) const;
631
 
632
      /**
633
       *  @brief  Parse input year string.
634
       *
635
       *  This function reads up to 4 characters to parse a year string and
636
       *  puts the results into a user-supplied struct tm.  This function is a
637
       *  hook for derived classes to change the value returned.  @see
638
       *  get_year() for details.
639
       *
640
       *  @param  beg  Start of string to parse.
641
       *  @param  end  End of string to parse.
642
       *  @param  io  Source of the locale.
643
       *  @param  err  Error flags to set.
644
       *  @param  tm  Pointer to struct tm to fill in.
645
       *  @return  Iterator to first char beyond year.
646
      */
647
      virtual iter_type
648
      do_get_year(iter_type __beg, iter_type __end, ios_base& __io,
649
                  ios_base::iostate& __err, tm* __tm) const;
650
 
651
      // Extract numeric component of length __len.
652
      iter_type
653
      _M_extract_num(iter_type __beg, iter_type __end, int& __member,
654
                     int __min, int __max, size_t __len,
655
                     ios_base& __io, ios_base::iostate& __err) const;
656
 
657
      // Extract any unique array of string literals in a const _CharT* array.
658
      iter_type
659
      _M_extract_name(iter_type __beg, iter_type __end, int& __member,
660
                      const _CharT** __names, size_t __indexlen,
661
                      ios_base& __io, ios_base::iostate& __err) const;
662
 
663
      // Extract day or month name in a const _CharT* array.
664
      iter_type
665
      _M_extract_wday_or_month(iter_type __beg, iter_type __end, int& __member,
666
                               const _CharT** __names, size_t __indexlen,
667
                               ios_base& __io, ios_base::iostate& __err) const;
668
 
669
      // Extract on a component-by-component basis, via __format argument.
670
      iter_type
671
      _M_extract_via_format(iter_type __beg, iter_type __end, ios_base& __io,
672
                            ios_base::iostate& __err, tm* __tm,
673
                            const _CharT* __format) const;
674
    };
675
 
676
  template<typename _CharT, typename _InIter>
677
    locale::id time_get<_CharT, _InIter>::id;
678
 
679
  /// class time_get_byname [22.2.5.2].
680
  template<typename _CharT, typename _InIter>
681
    class time_get_byname : public time_get<_CharT, _InIter>
682
    {
683
    public:
684
      // Types:
685
      typedef _CharT                    char_type;
686
      typedef _InIter                   iter_type;
687
 
688
      explicit
689
      time_get_byname(const char*, size_t __refs = 0)
690
      : time_get<_CharT, _InIter>(__refs) { }
691
 
692
    protected:
693
      virtual
694
      ~time_get_byname() { }
695
    };
696
 
697
  /**
698
   *  @brief  Primary class template time_put.
699
   *  @ingroup locales
700
   *
701
   *  This facet encapsulates the code to format and output dates and times
702
   *  according to formats used by strftime().
703
   *
704
   *  The time_put template uses protected virtual functions to provide the
705
   *  actual results.  The public accessors forward the call to the virtual
706
   *  functions.  These virtual functions are hooks for developers to
707
   *  implement the behavior they require from the time_put facet.
708
  */
709
  template<typename _CharT, typename _OutIter>
710
    class time_put : public locale::facet
711
    {
712
    public:
713
      // Types:
714
      //@{
715
      /// Public typedefs
716
      typedef _CharT                    char_type;
717
      typedef _OutIter                  iter_type;
718
      //@}
719
 
720
      /// Numpunct facet id.
721
      static locale::id                 id;
722
 
723
      /**
724
       *  @brief  Constructor performs initialization.
725
       *
726
       *  This is the constructor provided by the standard.
727
       *
728
       *  @param refs  Passed to the base facet class.
729
      */
730
      explicit
731
      time_put(size_t __refs = 0)
732
      : facet(__refs) { }
733
 
734
      /**
735
       *  @brief  Format and output a time or date.
736
       *
737
       *  This function formats the data in struct tm according to the
738
       *  provided format string.  The format string is interpreted as by
739
       *  strftime().
740
       *
741
       *  @param  s  The stream to write to.
742
       *  @param  io  Source of locale.
743
       *  @param  fill  char_type to use for padding.
744
       *  @param  tm  Struct tm with date and time info to format.
745
       *  @param  beg  Start of format string.
746
       *  @param  end  End of format string.
747
       *  @return  Iterator after writing.
748
       */
749
      iter_type
750
      put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
751
          const _CharT* __beg, const _CharT* __end) const;
752
 
753
      /**
754
       *  @brief  Format and output a time or date.
755
       *
756
       *  This function formats the data in struct tm according to the
757
       *  provided format char and optional modifier.  The format and modifier
758
       *  are interpreted as by strftime().  It does so by returning
759
       *  time_put::do_put().
760
       *
761
       *  @param  s  The stream to write to.
762
       *  @param  io  Source of locale.
763
       *  @param  fill  char_type to use for padding.
764
       *  @param  tm  Struct tm with date and time info to format.
765
       *  @param  format  Format char.
766
       *  @param  mod  Optional modifier char.
767
       *  @return  Iterator after writing.
768
       */
769
      iter_type
770
      put(iter_type __s, ios_base& __io, char_type __fill,
771
          const tm* __tm, char __format, char __mod = 0) const
772
      { return this->do_put(__s, __io, __fill, __tm, __format, __mod); }
773
 
774
    protected:
775
      /// Destructor.
776
      virtual
777
      ~time_put()
778
      { }
779
 
780
      /**
781
       *  @brief  Format and output a time or date.
782
       *
783
       *  This function formats the data in struct tm according to the
784
       *  provided format char and optional modifier.  This function is a hook
785
       *  for derived classes to change the value returned.  @see put() for
786
       *  more details.
787
       *
788
       *  @param  s  The stream to write to.
789
       *  @param  io  Source of locale.
790
       *  @param  fill  char_type to use for padding.
791
       *  @param  tm  Struct tm with date and time info to format.
792
       *  @param  format  Format char.
793
       *  @param  mod  Optional modifier char.
794
       *  @return  Iterator after writing.
795
       */
796
      virtual iter_type
797
      do_put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
798
             char __format, char __mod) const;
799
    };
800
 
801
  template<typename _CharT, typename _OutIter>
802
    locale::id time_put<_CharT, _OutIter>::id;
803
 
804
  /// class time_put_byname [22.2.5.4].
805
  template<typename _CharT, typename _OutIter>
806
    class time_put_byname : public time_put<_CharT, _OutIter>
807
    {
808
    public:
809
      // Types:
810
      typedef _CharT                    char_type;
811
      typedef _OutIter                  iter_type;
812
 
813
      explicit
814
      time_put_byname(const char*, size_t __refs = 0)
815
      : time_put<_CharT, _OutIter>(__refs)
816
      { };
817
 
818
    protected:
819
      virtual
820
      ~time_put_byname() { }
821
    };
822
 
823
 
824
  /**
825
   *  @brief  Money format ordering data.
826
   *  @ingroup locales
827
   *
828
   *  This class contains an ordered array of 4 fields to represent the
829
   *  pattern for formatting a money amount.  Each field may contain one entry
830
   *  from the part enum.  symbol, sign, and value must be present and the
831
   *  remaining field must contain either none or space.  @see
832
   *  moneypunct::pos_format() and moneypunct::neg_format() for details of how
833
   *  these fields are interpreted.
834
  */
835
  class money_base
836
  {
837
  public:
838
    enum part { none, space, symbol, sign, value };
839
    struct pattern { char field[4]; };
840
 
841
    static const pattern _S_default_pattern;
842
 
843
    enum
844
    {
845
      _S_minus,
846
      _S_zero,
847
      _S_end = 11
848
    };
849
 
850
    // String literal of acceptable (narrow) input/output, for
851
    // money_get/money_put. "-0123456789"
852
    static const char* _S_atoms;
853
 
854
    // Construct and return valid pattern consisting of some combination of:
855
    // space none symbol sign value
856
    _GLIBCXX_CONST static pattern
857
    _S_construct_pattern(char __precedes, char __space, char __posn) throw ();
858
  };
859
 
860
  template<typename _CharT, bool _Intl>
861
    struct __moneypunct_cache : public locale::facet
862
    {
863
      const char*                       _M_grouping;
864
      size_t                            _M_grouping_size;
865
      bool                              _M_use_grouping;
866
      _CharT                            _M_decimal_point;
867
      _CharT                            _M_thousands_sep;
868
      const _CharT*                     _M_curr_symbol;
869
      size_t                            _M_curr_symbol_size;
870
      const _CharT*                     _M_positive_sign;
871
      size_t                            _M_positive_sign_size;
872
      const _CharT*                     _M_negative_sign;
873
      size_t                            _M_negative_sign_size;
874
      int                               _M_frac_digits;
875
      money_base::pattern               _M_pos_format;
876
      money_base::pattern               _M_neg_format;
877
 
878
      // A list of valid numeric literals for input and output: in the standard
879
      // "C" locale, this is "-0123456789". This array contains the chars after
880
      // having been passed through the current locale's ctype<_CharT>.widen().
881
      _CharT                            _M_atoms[money_base::_S_end];
882
 
883
      bool                              _M_allocated;
884
 
885
      __moneypunct_cache(size_t __refs = 0) : facet(__refs),
886
      _M_grouping(NULL), _M_grouping_size(0), _M_use_grouping(false),
887
      _M_decimal_point(_CharT()), _M_thousands_sep(_CharT()),
888
      _M_curr_symbol(NULL), _M_curr_symbol_size(0),
889
      _M_positive_sign(NULL), _M_positive_sign_size(0),
890
      _M_negative_sign(NULL), _M_negative_sign_size(0),
891
      _M_frac_digits(0),
892
      _M_pos_format(money_base::pattern()),
893
      _M_neg_format(money_base::pattern()), _M_allocated(false)
894
      { }
895
 
896
      ~__moneypunct_cache();
897
 
898
      void
899
      _M_cache(const locale& __loc);
900
 
901
    private:
902
      __moneypunct_cache&
903
      operator=(const __moneypunct_cache&);
904
 
905
      explicit
906
      __moneypunct_cache(const __moneypunct_cache&);
907
    };
908
 
909
  template<typename _CharT, bool _Intl>
910
    __moneypunct_cache<_CharT, _Intl>::~__moneypunct_cache()
911
    {
912
      if (_M_allocated)
913
        {
914
          delete [] _M_grouping;
915
          delete [] _M_curr_symbol;
916
          delete [] _M_positive_sign;
917
          delete [] _M_negative_sign;
918
        }
919
    }
920
 
921
  /**
922
   *  @brief  Primary class template moneypunct.
923
   *  @ingroup locales
924
   *
925
   *  This facet encapsulates the punctuation, grouping and other formatting
926
   *  features of money amount string representations.
927
  */
928
  template<typename _CharT, bool _Intl>
929
    class moneypunct : public locale::facet, public money_base
930
    {
931
    public:
932
      // Types:
933
      //@{
934
      /// Public typedefs
935
      typedef _CharT                    char_type;
936
      typedef basic_string<_CharT>      string_type;
937
      //@}
938
      typedef __moneypunct_cache<_CharT, _Intl>     __cache_type;
939
 
940
    private:
941
      __cache_type*                     _M_data;
942
 
943
    public:
944
      /// This value is provided by the standard, but no reason for its
945
      /// existence.
946
      static const bool                 intl = _Intl;
947
      /// Numpunct facet id.
948
      static locale::id                 id;
949
 
950
      /**
951
       *  @brief  Constructor performs initialization.
952
       *
953
       *  This is the constructor provided by the standard.
954
       *
955
       *  @param refs  Passed to the base facet class.
956
      */
957
      explicit
958
      moneypunct(size_t __refs = 0) : facet(__refs), _M_data(NULL)
959
      { _M_initialize_moneypunct(); }
960
 
961
      /**
962
       *  @brief  Constructor performs initialization.
963
       *
964
       *  This is an internal constructor.
965
       *
966
       *  @param cache  Cache for optimization.
967
       *  @param refs  Passed to the base facet class.
968
      */
969
      explicit
970
      moneypunct(__cache_type* __cache, size_t __refs = 0)
971
      : facet(__refs), _M_data(__cache)
972
      { _M_initialize_moneypunct(); }
973
 
974
      /**
975
       *  @brief  Internal constructor. Not for general use.
976
       *
977
       *  This is a constructor for use by the library itself to set up new
978
       *  locales.
979
       *
980
       *  @param cloc  The C locale.
981
       *  @param s  The name of a locale.
982
       *  @param refs  Passed to the base facet class.
983
      */
984
      explicit
985
      moneypunct(__c_locale __cloc, const char* __s, size_t __refs = 0)
986
      : facet(__refs), _M_data(NULL)
987
      { _M_initialize_moneypunct(__cloc, __s); }
988
 
989
      /**
990
       *  @brief  Return decimal point character.
991
       *
992
       *  This function returns a char_type to use as a decimal point.  It
993
       *  does so by returning returning
994
       *  moneypunct<char_type>::do_decimal_point().
995
       *
996
       *  @return  @a char_type representing a decimal point.
997
      */
998
      char_type
999
      decimal_point() const
1000
      { return this->do_decimal_point(); }
1001
 
1002
      /**
1003
       *  @brief  Return thousands separator character.
1004
       *
1005
       *  This function returns a char_type to use as a thousands
1006
       *  separator.  It does so by returning returning
1007
       *  moneypunct<char_type>::do_thousands_sep().
1008
       *
1009
       *  @return  char_type representing a thousands separator.
1010
      */
1011
      char_type
1012
      thousands_sep() const
1013
      { return this->do_thousands_sep(); }
1014
 
1015
      /**
1016
       *  @brief  Return grouping specification.
1017
       *
1018
       *  This function returns a string representing groupings for the
1019
       *  integer part of an amount.  Groupings indicate where thousands
1020
       *  separators should be inserted.
1021
       *
1022
       *  Each char in the return string is interpret as an integer rather
1023
       *  than a character.  These numbers represent the number of digits in a
1024
       *  group.  The first char in the string represents the number of digits
1025
       *  in the least significant group.  If a char is negative, it indicates
1026
       *  an unlimited number of digits for the group.  If more chars from the
1027
       *  string are required to group a number, the last char is used
1028
       *  repeatedly.
1029
       *
1030
       *  For example, if the grouping() returns <code>\003\002</code>
1031
       *  and is applied to the number 123456789, this corresponds to
1032
       *  12,34,56,789.  Note that if the string was <code>32</code>, this would
1033
       *  put more than 50 digits into the least significant group if
1034
       *  the character set is ASCII.
1035
       *
1036
       *  The string is returned by calling
1037
       *  moneypunct<char_type>::do_grouping().
1038
       *
1039
       *  @return  string representing grouping specification.
1040
      */
1041
      string
1042
      grouping() const
1043
      { return this->do_grouping(); }
1044
 
1045
      /**
1046
       *  @brief  Return currency symbol string.
1047
       *
1048
       *  This function returns a string_type to use as a currency symbol.  It
1049
       *  does so by returning returning
1050
       *  moneypunct<char_type>::do_curr_symbol().
1051
       *
1052
       *  @return  @a string_type representing a currency symbol.
1053
      */
1054
      string_type
1055
      curr_symbol() const
1056
      { return this->do_curr_symbol(); }
1057
 
1058
      /**
1059
       *  @brief  Return positive sign string.
1060
       *
1061
       *  This function returns a string_type to use as a sign for positive
1062
       *  amounts.  It does so by returning returning
1063
       *  moneypunct<char_type>::do_positive_sign().
1064
       *
1065
       *  If the return value contains more than one character, the first
1066
       *  character appears in the position indicated by pos_format() and the
1067
       *  remainder appear at the end of the formatted string.
1068
       *
1069
       *  @return  @a string_type representing a positive sign.
1070
      */
1071
      string_type
1072
      positive_sign() const
1073
      { return this->do_positive_sign(); }
1074
 
1075
      /**
1076
       *  @brief  Return negative sign string.
1077
       *
1078
       *  This function returns a string_type to use as a sign for negative
1079
       *  amounts.  It does so by returning returning
1080
       *  moneypunct<char_type>::do_negative_sign().
1081
       *
1082
       *  If the return value contains more than one character, the first
1083
       *  character appears in the position indicated by neg_format() and the
1084
       *  remainder appear at the end of the formatted string.
1085
       *
1086
       *  @return  @a string_type representing a negative sign.
1087
      */
1088
      string_type
1089
      negative_sign() const
1090
      { return this->do_negative_sign(); }
1091
 
1092
      /**
1093
       *  @brief  Return number of digits in fraction.
1094
       *
1095
       *  This function returns the exact number of digits that make up the
1096
       *  fractional part of a money amount.  It does so by returning
1097
       *  returning moneypunct<char_type>::do_frac_digits().
1098
       *
1099
       *  The fractional part of a money amount is optional.  But if it is
1100
       *  present, there must be frac_digits() digits.
1101
       *
1102
       *  @return  Number of digits in amount fraction.
1103
      */
1104
      int
1105
      frac_digits() const
1106
      { return this->do_frac_digits(); }
1107
 
1108
      //@{
1109
      /**
1110
       *  @brief  Return pattern for money values.
1111
       *
1112
       *  This function returns a pattern describing the formatting of a
1113
       *  positive or negative valued money amount.  It does so by returning
1114
       *  returning moneypunct<char_type>::do_pos_format() or
1115
       *  moneypunct<char_type>::do_neg_format().
1116
       *
1117
       *  The pattern has 4 fields describing the ordering of symbol, sign,
1118
       *  value, and none or space.  There must be one of each in the pattern.
1119
       *  The none and space enums may not appear in the first field and space
1120
       *  may not appear in the final field.
1121
       *
1122
       *  The parts of a money string must appear in the order indicated by
1123
       *  the fields of the pattern.  The symbol field indicates that the
1124
       *  value of curr_symbol() may be present.  The sign field indicates
1125
       *  that the value of positive_sign() or negative_sign() must be
1126
       *  present.  The value field indicates that the absolute value of the
1127
       *  money amount is present.  none indicates 0 or more whitespace
1128
       *  characters, except at the end, where it permits no whitespace.
1129
       *  space indicates that 1 or more whitespace characters must be
1130
       *  present.
1131
       *
1132
       *  For example, for the US locale and pos_format() pattern
1133
       *  {symbol,sign,value,none}, curr_symbol() == &apos;$&apos;
1134
       *  positive_sign() == &apos;+&apos;, and value 10.01, and
1135
       *  options set to force the symbol, the corresponding string is
1136
       *  <code>$+10.01</code>.
1137
       *
1138
       *  @return  Pattern for money values.
1139
      */
1140
      pattern
1141
      pos_format() const
1142
      { return this->do_pos_format(); }
1143
 
1144
      pattern
1145
      neg_format() const
1146
      { return this->do_neg_format(); }
1147
      //@}
1148
 
1149
    protected:
1150
      /// Destructor.
1151
      virtual
1152
      ~moneypunct();
1153
 
1154
      /**
1155
       *  @brief  Return decimal point character.
1156
       *
1157
       *  Returns a char_type to use as a decimal point.  This function is a
1158
       *  hook for derived classes to change the value returned.
1159
       *
1160
       *  @return  @a char_type representing a decimal point.
1161
      */
1162
      virtual char_type
1163
      do_decimal_point() const
1164
      { return _M_data->_M_decimal_point; }
1165
 
1166
      /**
1167
       *  @brief  Return thousands separator character.
1168
       *
1169
       *  Returns a char_type to use as a thousands separator.  This function
1170
       *  is a hook for derived classes to change the value returned.
1171
       *
1172
       *  @return  @a char_type representing a thousands separator.
1173
      */
1174
      virtual char_type
1175
      do_thousands_sep() const
1176
      { return _M_data->_M_thousands_sep; }
1177
 
1178
      /**
1179
       *  @brief  Return grouping specification.
1180
       *
1181
       *  Returns a string representing groupings for the integer part of a
1182
       *  number.  This function is a hook for derived classes to change the
1183
       *  value returned.  @see grouping() for details.
1184
       *
1185
       *  @return  String representing grouping specification.
1186
      */
1187
      virtual string
1188
      do_grouping() const
1189
      { return _M_data->_M_grouping; }
1190
 
1191
      /**
1192
       *  @brief  Return currency symbol string.
1193
       *
1194
       *  This function returns a string_type to use as a currency symbol.
1195
       *  This function is a hook for derived classes to change the value
1196
       *  returned.  @see curr_symbol() for details.
1197
       *
1198
       *  @return  @a string_type representing a currency symbol.
1199
      */
1200
      virtual string_type
1201
      do_curr_symbol()   const
1202
      { return _M_data->_M_curr_symbol; }
1203
 
1204
      /**
1205
       *  @brief  Return positive sign string.
1206
       *
1207
       *  This function returns a string_type to use as a sign for positive
1208
       *  amounts.  This function is a hook for derived classes to change the
1209
       *  value returned.  @see positive_sign() for details.
1210
       *
1211
       *  @return  @a string_type representing a positive sign.
1212
      */
1213
      virtual string_type
1214
      do_positive_sign() const
1215
      { return _M_data->_M_positive_sign; }
1216
 
1217
      /**
1218
       *  @brief  Return negative sign string.
1219
       *
1220
       *  This function returns a string_type to use as a sign for negative
1221
       *  amounts.  This function is a hook for derived classes to change the
1222
       *  value returned.  @see negative_sign() for details.
1223
       *
1224
       *  @return  @a string_type representing a negative sign.
1225
      */
1226
      virtual string_type
1227
      do_negative_sign() const
1228
      { return _M_data->_M_negative_sign; }
1229
 
1230
      /**
1231
       *  @brief  Return number of digits in fraction.
1232
       *
1233
       *  This function returns the exact number of digits that make up the
1234
       *  fractional part of a money amount.  This function is a hook for
1235
       *  derived classes to change the value returned.  @see frac_digits()
1236
       *  for details.
1237
       *
1238
       *  @return  Number of digits in amount fraction.
1239
      */
1240
      virtual int
1241
      do_frac_digits() const
1242
      { return _M_data->_M_frac_digits; }
1243
 
1244
      /**
1245
       *  @brief  Return pattern for money values.
1246
       *
1247
       *  This function returns a pattern describing the formatting of a
1248
       *  positive valued money amount.  This function is a hook for derived
1249
       *  classes to change the value returned.  @see pos_format() for
1250
       *  details.
1251
       *
1252
       *  @return  Pattern for money values.
1253
      */
1254
      virtual pattern
1255
      do_pos_format() const
1256
      { return _M_data->_M_pos_format; }
1257
 
1258
      /**
1259
       *  @brief  Return pattern for money values.
1260
       *
1261
       *  This function returns a pattern describing the formatting of a
1262
       *  negative valued money amount.  This function is a hook for derived
1263
       *  classes to change the value returned.  @see neg_format() for
1264
       *  details.
1265
       *
1266
       *  @return  Pattern for money values.
1267
      */
1268
      virtual pattern
1269
      do_neg_format() const
1270
      { return _M_data->_M_neg_format; }
1271
 
1272
      // For use at construction time only.
1273
       void
1274
       _M_initialize_moneypunct(__c_locale __cloc = NULL,
1275
                                const char* __name = NULL);
1276
    };
1277
 
1278
  template<typename _CharT, bool _Intl>
1279
    locale::id moneypunct<_CharT, _Intl>::id;
1280
 
1281
  template<typename _CharT, bool _Intl>
1282
    const bool moneypunct<_CharT, _Intl>::intl;
1283
 
1284
  template<>
1285
    moneypunct<char, true>::~moneypunct();
1286
 
1287
  template<>
1288
    moneypunct<char, false>::~moneypunct();
1289
 
1290
  template<>
1291
    void
1292
    moneypunct<char, true>::_M_initialize_moneypunct(__c_locale, const char*);
1293
 
1294
  template<>
1295
    void
1296
    moneypunct<char, false>::_M_initialize_moneypunct(__c_locale, const char*);
1297
 
1298
#ifdef _GLIBCXX_USE_WCHAR_T
1299
  template<>
1300
    moneypunct<wchar_t, true>::~moneypunct();
1301
 
1302
  template<>
1303
    moneypunct<wchar_t, false>::~moneypunct();
1304
 
1305
  template<>
1306
    void
1307
    moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale,
1308
                                                        const char*);
1309
 
1310
  template<>
1311
    void
1312
    moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale,
1313
                                                         const char*);
1314
#endif
1315
 
1316
  /// class moneypunct_byname [22.2.6.4].
1317
  template<typename _CharT, bool _Intl>
1318
    class moneypunct_byname : public moneypunct<_CharT, _Intl>
1319
    {
1320
    public:
1321
      typedef _CharT                    char_type;
1322
      typedef basic_string<_CharT>      string_type;
1323
 
1324
      static const bool intl = _Intl;
1325
 
1326
      explicit
1327
      moneypunct_byname(const char* __s, size_t __refs = 0)
1328
      : moneypunct<_CharT, _Intl>(__refs)
1329
      {
1330
        if (__builtin_strcmp(__s, "C") != 0
1331
            && __builtin_strcmp(__s, "POSIX") != 0)
1332
          {
1333
            __c_locale __tmp;
1334
            this->_S_create_c_locale(__tmp, __s);
1335
            this->_M_initialize_moneypunct(__tmp);
1336
            this->_S_destroy_c_locale(__tmp);
1337
          }
1338
      }
1339
 
1340
    protected:
1341
      virtual
1342
      ~moneypunct_byname() { }
1343
    };
1344
 
1345
  template<typename _CharT, bool _Intl>
1346
    const bool moneypunct_byname<_CharT, _Intl>::intl;
1347
 
1348
_GLIBCXX_BEGIN_LDBL_NAMESPACE
1349
 
1350
  /**
1351
   *  @brief  Primary class template money_get.
1352
   *  @ingroup locales
1353
   *
1354
   *  This facet encapsulates the code to parse and return a monetary
1355
   *  amount from a string.
1356
   *
1357
   *  The money_get template uses protected virtual functions to
1358
   *  provide the actual results.  The public accessors forward the
1359
   *  call to the virtual functions.  These virtual functions are
1360
   *  hooks for developers to implement the behavior they require from
1361
   *  the money_get facet.
1362
  */
1363
  template<typename _CharT, typename _InIter>
1364
    class money_get : public locale::facet
1365
    {
1366
    public:
1367
      // Types:
1368
      //@{
1369
      /// Public typedefs
1370
      typedef _CharT                    char_type;
1371
      typedef _InIter                   iter_type;
1372
      typedef basic_string<_CharT>      string_type;
1373
      //@}
1374
 
1375
      /// Numpunct facet id.
1376
      static locale::id                 id;
1377
 
1378
      /**
1379
       *  @brief  Constructor performs initialization.
1380
       *
1381
       *  This is the constructor provided by the standard.
1382
       *
1383
       *  @param refs  Passed to the base facet class.
1384
      */
1385
      explicit
1386
      money_get(size_t __refs = 0) : facet(__refs) { }
1387
 
1388
      /**
1389
       *  @brief  Read and parse a monetary value.
1390
       *
1391
       *  This function reads characters from @a s, interprets them as a
1392
       *  monetary value according to moneypunct and ctype facets retrieved
1393
       *  from io.getloc(), and returns the result in @a units as an integral
1394
       *  value moneypunct::frac_digits() * the actual amount.  For example,
1395
       *  the string $10.01 in a US locale would store 1001 in @a units.
1396
       *
1397
       *  Any characters not part of a valid money amount are not consumed.
1398
       *
1399
       *  If a money value cannot be parsed from the input stream, sets
1400
       *  err=(err|io.failbit).  If the stream is consumed before finishing
1401
       *  parsing,  sets err=(err|io.failbit|io.eofbit).  @a units is
1402
       *  unchanged if parsing fails.
1403
       *
1404
       *  This function works by returning the result of do_get().
1405
       *
1406
       *  @param  s  Start of characters to parse.
1407
       *  @param  end  End of characters to parse.
1408
       *  @param  intl  Parameter to use_facet<moneypunct<CharT,intl> >.
1409
       *  @param  io  Source of facets and io state.
1410
       *  @param  err  Error field to set if parsing fails.
1411
       *  @param  units  Place to store result of parsing.
1412
       *  @return  Iterator referencing first character beyond valid money
1413
       *           amount.
1414
       */
1415
      iter_type
1416
      get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1417
          ios_base::iostate& __err, long double& __units) const
1418
      { return this->do_get(__s, __end, __intl, __io, __err, __units); }
1419
 
1420
      /**
1421
       *  @brief  Read and parse a monetary value.
1422
       *
1423
       *  This function reads characters from @a s, interprets them as
1424
       *  a monetary value according to moneypunct and ctype facets
1425
       *  retrieved from io.getloc(), and returns the result in @a
1426
       *  digits.  For example, the string $10.01 in a US locale would
1427
       *  store <code>1001</code> in @a digits.
1428
       *
1429
       *  Any characters not part of a valid money amount are not consumed.
1430
       *
1431
       *  If a money value cannot be parsed from the input stream, sets
1432
       *  err=(err|io.failbit).  If the stream is consumed before finishing
1433
       *  parsing,  sets err=(err|io.failbit|io.eofbit).
1434
       *
1435
       *  This function works by returning the result of do_get().
1436
       *
1437
       *  @param  s  Start of characters to parse.
1438
       *  @param  end  End of characters to parse.
1439
       *  @param  intl  Parameter to use_facet<moneypunct<CharT,intl> >.
1440
       *  @param  io  Source of facets and io state.
1441
       *  @param  err  Error field to set if parsing fails.
1442
       *  @param  digits  Place to store result of parsing.
1443
       *  @return  Iterator referencing first character beyond valid money
1444
       *           amount.
1445
       */
1446
      iter_type
1447
      get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1448
          ios_base::iostate& __err, string_type& __digits) const
1449
      { return this->do_get(__s, __end, __intl, __io, __err, __digits); }
1450
 
1451
    protected:
1452
      /// Destructor.
1453
      virtual
1454
      ~money_get() { }
1455
 
1456
      /**
1457
       *  @brief  Read and parse a monetary value.
1458
       *
1459
       *  This function reads and parses characters representing a monetary
1460
       *  value.  This function is a hook for derived classes to change the
1461
       *  value returned.  @see get() for details.
1462
       */
1463
      // XXX GLIBCXX_ABI Deprecated
1464
#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
1465
      virtual iter_type
1466
      __do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1467
               ios_base::iostate& __err, double& __units) const;
1468
#else
1469
      virtual iter_type
1470
      do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1471
             ios_base::iostate& __err, long double& __units) const;
1472
#endif
1473
 
1474
      /**
1475
       *  @brief  Read and parse a monetary value.
1476
       *
1477
       *  This function reads and parses characters representing a monetary
1478
       *  value.  This function is a hook for derived classes to change the
1479
       *  value returned.  @see get() for details.
1480
       */
1481
      virtual iter_type
1482
      do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1483
             ios_base::iostate& __err, string_type& __digits) const;
1484
 
1485
      // XXX GLIBCXX_ABI Deprecated
1486
#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
1487
      virtual iter_type
1488
      do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1489
             ios_base::iostate& __err, long double& __units) const;
1490
#endif
1491
 
1492
      template<bool _Intl>
1493
        iter_type
1494
        _M_extract(iter_type __s, iter_type __end, ios_base& __io,
1495
                   ios_base::iostate& __err, string& __digits) const;
1496
    };
1497
 
1498
  template<typename _CharT, typename _InIter>
1499
    locale::id money_get<_CharT, _InIter>::id;
1500
 
1501
  /**
1502
   *  @brief  Primary class template money_put.
1503
   *  @ingroup locales
1504
   *
1505
   *  This facet encapsulates the code to format and output a monetary
1506
   *  amount.
1507
   *
1508
   *  The money_put template uses protected virtual functions to
1509
   *  provide the actual results.  The public accessors forward the
1510
   *  call to the virtual functions.  These virtual functions are
1511
   *  hooks for developers to implement the behavior they require from
1512
   *  the money_put facet.
1513
  */
1514
  template<typename _CharT, typename _OutIter>
1515
    class money_put : public locale::facet
1516
    {
1517
    public:
1518
      //@{
1519
      /// Public typedefs
1520
      typedef _CharT                    char_type;
1521
      typedef _OutIter                  iter_type;
1522
      typedef basic_string<_CharT>      string_type;
1523
      //@}
1524
 
1525
      /// Numpunct facet id.
1526
      static locale::id                 id;
1527
 
1528
      /**
1529
       *  @brief  Constructor performs initialization.
1530
       *
1531
       *  This is the constructor provided by the standard.
1532
       *
1533
       *  @param refs  Passed to the base facet class.
1534
      */
1535
      explicit
1536
      money_put(size_t __refs = 0) : facet(__refs) { }
1537
 
1538
      /**
1539
       *  @brief  Format and output a monetary value.
1540
       *
1541
       *  This function formats @a units as a monetary value according to
1542
       *  moneypunct and ctype facets retrieved from io.getloc(), and writes
1543
       *  the resulting characters to @a s.  For example, the value 1001 in a
1544
       *  US locale would write <code>$10.01</code> to @a s.
1545
       *
1546
       *  This function works by returning the result of do_put().
1547
       *
1548
       *  @param  s  The stream to write to.
1549
       *  @param  intl  Parameter to use_facet<moneypunct<CharT,intl> >.
1550
       *  @param  io  Source of facets and io state.
1551
       *  @param  fill  char_type to use for padding.
1552
       *  @param  units  Place to store result of parsing.
1553
       *  @return  Iterator after writing.
1554
       */
1555
      iter_type
1556
      put(iter_type __s, bool __intl, ios_base& __io,
1557
          char_type __fill, long double __units) const
1558
      { return this->do_put(__s, __intl, __io, __fill, __units); }
1559
 
1560
      /**
1561
       *  @brief  Format and output a monetary value.
1562
       *
1563
       *  This function formats @a digits as a monetary value
1564
       *  according to moneypunct and ctype facets retrieved from
1565
       *  io.getloc(), and writes the resulting characters to @a s.
1566
       *  For example, the string <code>1001</code> in a US locale
1567
       *  would write <code>$10.01</code> to @a s.
1568
       *
1569
       *  This function works by returning the result of do_put().
1570
       *
1571
       *  @param  s  The stream to write to.
1572
       *  @param  intl  Parameter to use_facet<moneypunct<CharT,intl> >.
1573
       *  @param  io  Source of facets and io state.
1574
       *  @param  fill  char_type to use for padding.
1575
       *  @param  units  Place to store result of parsing.
1576
       *  @return  Iterator after writing.
1577
       */
1578
      iter_type
1579
      put(iter_type __s, bool __intl, ios_base& __io,
1580
          char_type __fill, const string_type& __digits) const
1581
      { return this->do_put(__s, __intl, __io, __fill, __digits); }
1582
 
1583
    protected:
1584
      /// Destructor.
1585
      virtual
1586
      ~money_put() { }
1587
 
1588
      /**
1589
       *  @brief  Format and output a monetary value.
1590
       *
1591
       *  This function formats @a units as a monetary value according to
1592
       *  moneypunct and ctype facets retrieved from io.getloc(), and writes
1593
       *  the resulting characters to @a s.  For example, the value 1001 in a
1594
       *  US locale would write <code>$10.01</code> to @a s.
1595
       *
1596
       *  This function is a hook for derived classes to change the value
1597
       *  returned.  @see put().
1598
       *
1599
       *  @param  s  The stream to write to.
1600
       *  @param  intl  Parameter to use_facet<moneypunct<CharT,intl> >.
1601
       *  @param  io  Source of facets and io state.
1602
       *  @param  fill  char_type to use for padding.
1603
       *  @param  units  Place to store result of parsing.
1604
       *  @return  Iterator after writing.
1605
       */
1606
      // XXX GLIBCXX_ABI Deprecated
1607
#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
1608
      virtual iter_type
1609
      __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1610
               double __units) const;
1611
#else
1612
      virtual iter_type
1613
      do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1614
             long double __units) const;
1615
#endif
1616
 
1617
      /**
1618
       *  @brief  Format and output a monetary value.
1619
       *
1620
       *  This function formats @a digits as a monetary value
1621
       *  according to moneypunct and ctype facets retrieved from
1622
       *  io.getloc(), and writes the resulting characters to @a s.
1623
       *  For example, the string <code>1001</code> in a US locale
1624
       *  would write <code>$10.01</code> to @a s.
1625
       *
1626
       *  This function is a hook for derived classes to change the value
1627
       *  returned.  @see put().
1628
       *
1629
       *  @param  s  The stream to write to.
1630
       *  @param  intl  Parameter to use_facet<moneypunct<CharT,intl> >.
1631
       *  @param  io  Source of facets and io state.
1632
       *  @param  fill  char_type to use for padding.
1633
       *  @param  units  Place to store result of parsing.
1634
       *  @return  Iterator after writing.
1635
       */
1636
      virtual iter_type
1637
      do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1638
             const string_type& __digits) const;
1639
 
1640
      // XXX GLIBCXX_ABI Deprecated
1641
#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
1642
      virtual iter_type
1643
      do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1644
             long double __units) const;
1645
#endif
1646
 
1647
      template<bool _Intl>
1648
        iter_type
1649
        _M_insert(iter_type __s, ios_base& __io, char_type __fill,
1650
                  const string_type& __digits) const;
1651
    };
1652
 
1653
  template<typename _CharT, typename _OutIter>
1654
    locale::id money_put<_CharT, _OutIter>::id;
1655
 
1656
_GLIBCXX_END_LDBL_NAMESPACE
1657
 
1658
  /**
1659
   *  @brief  Messages facet base class providing catalog typedef.
1660
   *  @ingroup locales
1661
   */
1662
  struct messages_base
1663
  {
1664
    typedef int catalog;
1665
  };
1666
 
1667
  /**
1668
   *  @brief  Primary class template messages.
1669
   *  @ingroup locales
1670
   *
1671
   *  This facet encapsulates the code to retrieve messages from
1672
   *  message catalogs.  The only thing defined by the standard for this facet
1673
   *  is the interface.  All underlying functionality is
1674
   *  implementation-defined.
1675
   *
1676
   *  This library currently implements 3 versions of the message facet.  The
1677
   *  first version (gnu) is a wrapper around gettext, provided by libintl.
1678
   *  The second version (ieee) is a wrapper around catgets.  The final
1679
   *  version (default) does no actual translation.  These implementations are
1680
   *  only provided for char and wchar_t instantiations.
1681
   *
1682
   *  The messages template uses protected virtual functions to
1683
   *  provide the actual results.  The public accessors forward the
1684
   *  call to the virtual functions.  These virtual functions are
1685
   *  hooks for developers to implement the behavior they require from
1686
   *  the messages facet.
1687
  */
1688
  template<typename _CharT>
1689
    class messages : public locale::facet, public messages_base
1690
    {
1691
    public:
1692
      // Types:
1693
      //@{
1694
      /// Public typedefs
1695
      typedef _CharT                    char_type;
1696
      typedef basic_string<_CharT>      string_type;
1697
      //@}
1698
 
1699
    protected:
1700
      // Underlying "C" library locale information saved from
1701
      // initialization, needed by messages_byname as well.
1702
      __c_locale                        _M_c_locale_messages;
1703
      const char*                       _M_name_messages;
1704
 
1705
    public:
1706
      /// Numpunct facet id.
1707
      static locale::id                 id;
1708
 
1709
      /**
1710
       *  @brief  Constructor performs initialization.
1711
       *
1712
       *  This is the constructor provided by the standard.
1713
       *
1714
       *  @param refs  Passed to the base facet class.
1715
      */
1716
      explicit
1717
      messages(size_t __refs = 0);
1718
 
1719
      // Non-standard.
1720
      /**
1721
       *  @brief  Internal constructor.  Not for general use.
1722
       *
1723
       *  This is a constructor for use by the library itself to set up new
1724
       *  locales.
1725
       *
1726
       *  @param  cloc  The C locale.
1727
       *  @param  s  The name of a locale.
1728
       *  @param  refs  Refcount to pass to the base class.
1729
       */
1730
      explicit
1731
      messages(__c_locale __cloc, const char* __s, size_t __refs = 0);
1732
 
1733
      /*
1734
       *  @brief  Open a message catalog.
1735
       *
1736
       *  This function opens and returns a handle to a message catalog by
1737
       *  returning do_open(s, loc).
1738
       *
1739
       *  @param  s  The catalog to open.
1740
       *  @param  loc  Locale to use for character set conversions.
1741
       *  @return  Handle to the catalog or value < 0 if open fails.
1742
      */
1743
      catalog
1744
      open(const basic_string<char>& __s, const locale& __loc) const
1745
      { return this->do_open(__s, __loc); }
1746
 
1747
      // Non-standard and unorthodox, yet effective.
1748
      /*
1749
       *  @brief  Open a message catalog.
1750
       *
1751
       *  This non-standard function opens and returns a handle to a message
1752
       *  catalog by returning do_open(s, loc).  The third argument provides a
1753
       *  message catalog root directory for gnu gettext and is ignored
1754
       *  otherwise.
1755
       *
1756
       *  @param  s  The catalog to open.
1757
       *  @param  loc  Locale to use for character set conversions.
1758
       *  @param  dir  Message catalog root directory.
1759
       *  @return  Handle to the catalog or value < 0 if open fails.
1760
      */
1761
      catalog
1762
      open(const basic_string<char>&, const locale&, const char*) const;
1763
 
1764
      /*
1765
       *  @brief  Look up a string in a message catalog.
1766
       *
1767
       *  This function retrieves and returns a message from a catalog by
1768
       *  returning do_get(c, set, msgid, s).
1769
       *
1770
       *  For gnu, @a set and @a msgid are ignored.  Returns gettext(s).
1771
       *  For default, returns s. For ieee, returns catgets(c,set,msgid,s).
1772
       *
1773
       *  @param  c  The catalog to access.
1774
       *  @param  set  Implementation-defined.
1775
       *  @param  msgid  Implementation-defined.
1776
       *  @param  s  Default return value if retrieval fails.
1777
       *  @return  Retrieved message or @a s if get fails.
1778
      */
1779
      string_type
1780
      get(catalog __c, int __set, int __msgid, const string_type& __s) const
1781
      { return this->do_get(__c, __set, __msgid, __s); }
1782
 
1783
      /*
1784
       *  @brief  Close a message catalog.
1785
       *
1786
       *  Closes catalog @a c by calling do_close(c).
1787
       *
1788
       *  @param  c  The catalog to close.
1789
      */
1790
      void
1791
      close(catalog __c) const
1792
      { return this->do_close(__c); }
1793
 
1794
    protected:
1795
      /// Destructor.
1796
      virtual
1797
      ~messages();
1798
 
1799
      /*
1800
       *  @brief  Open a message catalog.
1801
       *
1802
       *  This function opens and returns a handle to a message catalog in an
1803
       *  implementation-defined manner.  This function is a hook for derived
1804
       *  classes to change the value returned.
1805
       *
1806
       *  @param  s  The catalog to open.
1807
       *  @param  loc  Locale to use for character set conversions.
1808
       *  @return  Handle to the opened catalog, value < 0 if open failed.
1809
      */
1810
      virtual catalog
1811
      do_open(const basic_string<char>&, const locale&) const;
1812
 
1813
      /*
1814
       *  @brief  Look up a string in a message catalog.
1815
       *
1816
       *  This function retrieves and returns a message from a catalog in an
1817
       *  implementation-defined manner.  This function is a hook for derived
1818
       *  classes to change the value returned.
1819
       *
1820
       *  For gnu, @a set and @a msgid are ignored.  Returns gettext(s).
1821
       *  For default, returns s. For ieee, returns catgets(c,set,msgid,s).
1822
       *
1823
       *  @param  c  The catalog to access.
1824
       *  @param  set  Implementation-defined.
1825
       *  @param  msgid  Implementation-defined.
1826
       *  @param  s  Default return value if retrieval fails.
1827
       *  @return  Retrieved message or @a s if get fails.
1828
      */
1829
      virtual string_type
1830
      do_get(catalog, int, int, const string_type& __dfault) const;
1831
 
1832
      /*
1833
       *  @brief  Close a message catalog.
1834
       *
1835
       *  @param  c  The catalog to close.
1836
      */
1837
      virtual void
1838
      do_close(catalog) const;
1839
 
1840
      // Returns a locale and codeset-converted string, given a char* message.
1841
      char*
1842
      _M_convert_to_char(const string_type& __msg) const
1843
      {
1844
        // XXX
1845
        return reinterpret_cast<char*>(const_cast<_CharT*>(__msg.c_str()));
1846
      }
1847
 
1848
      // Returns a locale and codeset-converted string, given a char* message.
1849
      string_type
1850
      _M_convert_from_char(char*) const
1851
      {
1852
#if 0
1853
        // Length of message string without terminating null.
1854
        size_t __len = char_traits<char>::length(__msg) - 1;
1855
 
1856
        // "everybody can easily convert the string using
1857
        // mbsrtowcs/wcsrtombs or with iconv()"
1858
 
1859
        // Convert char* to _CharT in locale used to open catalog.
1860
        // XXX need additional template parameter on messages class for this..
1861
        // typedef typename codecvt<char, _CharT, _StateT> __codecvt_type;
1862
        typedef typename codecvt<char, _CharT, mbstate_t> __codecvt_type;
1863
 
1864
        __codecvt_type::state_type __state;
1865
        // XXX may need to initialize state.
1866
        //initialize_state(__state._M_init());
1867
 
1868
        char* __from_next;
1869
        // XXX what size for this string?
1870
        _CharT* __to = static_cast<_CharT*>(__builtin_alloca(__len + 1));
1871
        const __codecvt_type& __cvt = use_facet<__codecvt_type>(_M_locale_conv);
1872
        __cvt.out(__state, __msg, __msg + __len, __from_next,
1873
                  __to, __to + __len + 1, __to_next);
1874
        return string_type(__to);
1875
#endif
1876
#if 0
1877
        typedef ctype<_CharT> __ctype_type;
1878
        // const __ctype_type& __cvt = use_facet<__ctype_type>(_M_locale_msg);
1879
        const __ctype_type& __cvt = use_facet<__ctype_type>(locale());
1880
        // XXX Again, proper length of converted string an issue here.
1881
        // For now, assume the converted length is not larger.
1882
        _CharT* __dest = static_cast<_CharT*>(__builtin_alloca(__len + 1));
1883
        __cvt.widen(__msg, __msg + __len, __dest);
1884
        return basic_string<_CharT>(__dest);
1885
#endif
1886
        return string_type();
1887
      }
1888
     };
1889
 
1890
  template<typename _CharT>
1891
    locale::id messages<_CharT>::id;
1892
 
1893
  /// Specializations for required instantiations.
1894
  template<>
1895
    string
1896
    messages<char>::do_get(catalog, int, int, const string&) const;
1897
 
1898
#ifdef _GLIBCXX_USE_WCHAR_T
1899
  template<>
1900
    wstring
1901
    messages<wchar_t>::do_get(catalog, int, int, const wstring&) const;
1902
#endif
1903
 
1904
   /// class messages_byname [22.2.7.2].
1905
   template<typename _CharT>
1906
    class messages_byname : public messages<_CharT>
1907
    {
1908
    public:
1909
      typedef _CharT                    char_type;
1910
      typedef basic_string<_CharT>      string_type;
1911
 
1912
      explicit
1913
      messages_byname(const char* __s, size_t __refs = 0);
1914
 
1915
    protected:
1916
      virtual
1917
      ~messages_byname()
1918
      { }
1919
    };
1920
 
1921
_GLIBCXX_END_NAMESPACE
1922
 
1923
// Include host and configuration specific messages functions.
1924
#include <bits/messages_members.h>
1925
 
1926
// 22.2.1.5  Template class codecvt
1927
#include <bits/codecvt.h>
1928
 
1929
#ifndef _GLIBCXX_EXPORT_TEMPLATE
1930
# include <bits/locale_facets_nonio.tcc>
1931
#endif
1932
 
1933
#endif

powered by: WebSVN 2.1.0

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