1 // Locale support -*- C++ -*-
3 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
4 // Free Software Foundation, Inc.
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 2, or (at your option)
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING. If not, write to the Free
19 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
22 // As a special exception, you may use this file as part of a free software
23 // library without restriction. Specifically, if other files instantiate
24 // templates or use macros or inline functions from this file, or you compile
25 // this file and link it with other files to produce an executable, this
26 // file does not by itself cause the resulting executable to be covered by
27 // the GNU General Public License. This exception does not however
28 // invalidate any other reasons why the executable file might be covered by
29 // the GNU General Public License.
32 // ISO C++ 14882: 22.1 Locales
35 /** @file locale_facets.h
36 * This is an internal header file, included by other library headers.
37 * You should not attempt to use it directly.
40 #ifndef _CPP_BITS_LOCFACETS_H
41 #define _CPP_BITS_LOCFACETS_H 1
43 #pragma GCC system_header
45 #include <ctime> // For struct tm
46 #include <cwctype> // For wctype_t
47 #include <ios> // For ios_base
51 // NB: Don't instantiate required wchar_t facets if no wchar_t support.
52 #ifdef _GLIBCPP_USE_WCHAR_T
53 # define _GLIBCPP_NUM_FACETS 28
55 # define _GLIBCPP_NUM_FACETS 14
58 template<typename _CharT, typename _Traits>
61 // 22.2.1.1 Template class ctype
62 // Include host and configuration specific ctype enums for ctype_base.
63 #include <bits/ctype_base.h>
65 // Common base for ctype<_CharT>.
66 template<typename _CharT>
67 class __ctype_abstract_base : public locale::facet, public ctype_base
71 typedef _CharT char_type;
74 is(mask __m, char_type __c) const
75 { return this->do_is(__m, __c); }
78 is(const char_type *__lo, const char_type *__hi, mask *__vec) const
79 { return this->do_is(__lo, __hi, __vec); }
82 scan_is(mask __m, const char_type* __lo, const char_type* __hi) const
83 { return this->do_scan_is(__m, __lo, __hi); }
86 scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
87 { return this->do_scan_not(__m, __lo, __hi); }
90 toupper(char_type __c) const
91 { return this->do_toupper(__c); }
94 toupper(char_type *__lo, const char_type* __hi) const
95 { return this->do_toupper(__lo, __hi); }
98 tolower(char_type __c) const
99 { return this->do_tolower(__c); }
102 tolower(char_type* __lo, const char_type* __hi) const
103 { return this->do_tolower(__lo, __hi); }
106 widen(char __c) const
107 { return this->do_widen(__c); }
110 widen(const char* __lo, const char* __hi, char_type* __to) const
111 { return this->do_widen(__lo, __hi, __to); }
114 narrow(char_type __c, char __dfault) const
115 { return this->do_narrow(__c, __dfault); }
118 narrow(const char_type* __lo, const char_type* __hi,
119 char __dfault, char *__to) const
120 { return this->do_narrow(__lo, __hi, __dfault, __to); }
124 __ctype_abstract_base(size_t __refs = 0): locale::facet(__refs) { }
127 ~__ctype_abstract_base() { }
130 do_is(mask __m, char_type __c) const = 0;
132 virtual const char_type*
133 do_is(const char_type* __lo, const char_type* __hi,
134 mask* __vec) const = 0;
136 virtual const char_type*
137 do_scan_is(mask __m, const char_type* __lo,
138 const char_type* __hi) const = 0;
140 virtual const char_type*
141 do_scan_not(mask __m, const char_type* __lo,
142 const char_type* __hi) const = 0;
145 do_toupper(char_type) const = 0;
147 virtual const char_type*
148 do_toupper(char_type* __lo, const char_type* __hi) const = 0;
151 do_tolower(char_type) const = 0;
153 virtual const char_type*
154 do_tolower(char_type* __lo, const char_type* __hi) const = 0;
157 do_widen(char) const = 0;
160 do_widen(const char* __lo, const char* __hi,
161 char_type* __dest) const = 0;
164 do_narrow(char_type, char __dfault) const = 0;
166 virtual const char_type*
167 do_narrow(const char_type* __lo, const char_type* __hi,
168 char __dfault, char* __dest) const = 0;
171 // NB: Generic, mostly useless implementation.
172 template<typename _CharT>
173 class ctype : public __ctype_abstract_base<_CharT>
177 typedef _CharT char_type;
178 typedef typename ctype::mask mask;
180 static locale::id id;
183 ctype(size_t __refs = 0) : __ctype_abstract_base<_CharT>(__refs) { }
190 do_is(mask __m, char_type __c) const;
192 virtual const char_type*
193 do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
195 virtual const char_type*
196 do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
198 virtual const char_type*
199 do_scan_not(mask __m, const char_type* __lo,
200 const char_type* __hi) const;
203 do_toupper(char_type __c) const;
205 virtual const char_type*
206 do_toupper(char_type* __lo, const char_type* __hi) const;
209 do_tolower(char_type __c) const;
211 virtual const char_type*
212 do_tolower(char_type* __lo, const char_type* __hi) const;
215 do_widen(char __c) const;
218 do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
221 do_narrow(char_type, char __dfault) const;
223 virtual const char_type*
224 do_narrow(const char_type* __lo, const char_type* __hi,
225 char __dfault, char* __dest) const;
228 template<typename _CharT>
229 locale::id ctype<_CharT>::id;
231 // 22.2.1.3 ctype<char> specialization.
233 class ctype<char> : public __ctype_abstract_base<char>
237 typedef char char_type;
241 __c_locale _M_c_locale_ctype;
243 __to_type _M_toupper;
244 __to_type _M_tolower;
245 const mask* _M_table;
248 static locale::id id;
249 static const size_t table_size = 1 + static_cast<unsigned char>(-1);
252 ctype(const mask* __table = 0, bool __del = false, size_t __refs = 0);
255 ctype(__c_locale __cloc, const mask* __table = 0, bool __del = false,
259 is(mask __m, char __c) const;
262 is(const char* __lo, const char* __hi, mask* __vec) const;
265 scan_is(mask __m, const char* __lo, const char* __hi) const;
268 scan_not(mask __m, const char* __lo, const char* __hi) const;
272 table() const throw()
276 classic_table() throw();
282 do_is(mask __m, char_type __c) const;
284 virtual const char_type*
285 do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
287 virtual const char_type*
288 do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
290 virtual const char_type*
291 do_scan_not(mask __m, const char_type* __lo,
292 const char_type* __hi) const;
295 do_toupper(char_type) const;
297 virtual const char_type*
298 do_toupper(char_type* __lo, const char_type* __hi) const;
301 do_tolower(char_type) const;
303 virtual const char_type*
304 do_tolower(char_type* __lo, const char_type* __hi) const;
307 do_widen(char) const;
310 do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
313 do_narrow(char_type, char __dfault) const;
315 virtual const char_type*
316 do_narrow(const char_type* __lo, const char_type* __hi,
317 char __dfault, char* __dest) const;
322 use_facet<ctype<char> >(const locale& __loc);
324 #ifdef _GLIBCPP_USE_WCHAR_T
325 // 22.2.1.3 ctype<wchar_t> specialization
327 class ctype<wchar_t> : public __ctype_abstract_base<wchar_t>
331 typedef wchar_t char_type;
332 typedef wctype_t __wmask_type;
335 __c_locale _M_c_locale_ctype;
339 static locale::id id;
342 ctype(size_t __refs = 0);
345 ctype(__c_locale __cloc, size_t __refs = 0);
349 _M_convert_to_wmask(const mask __m) const;
355 do_is(mask __m, char_type __c) const;
357 virtual const char_type*
358 do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
360 virtual const char_type*
361 do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
363 virtual const char_type*
364 do_scan_not(mask __m, const char_type* __lo,
365 const char_type* __hi) const;
368 do_toupper(char_type) const;
370 virtual const char_type*
371 do_toupper(char_type* __lo, const char_type* __hi) const;
374 do_tolower(char_type) const;
376 virtual const char_type*
377 do_tolower(char_type* __lo, const char_type* __hi) const;
380 do_widen(char) const;
383 do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
386 do_narrow(char_type, char __dfault) const;
388 virtual const char_type*
389 do_narrow(const char_type* __lo, const char_type* __hi,
390 char __dfault, char* __dest) const;
395 const ctype<wchar_t>&
396 use_facet<ctype<wchar_t> >(const locale& __loc);
397 #endif //_GLIBCPP_USE_WCHAR_T
399 // Include host and configuration specific ctype inlines.
400 #include <bits/ctype_inline.h>
402 // 22.2.1.2 Template class ctype_byname
403 template<typename _CharT>
404 class ctype_byname : public ctype<_CharT>
407 typedef _CharT char_type;
410 ctype_byname(const char* __s, size_t __refs = 0);
417 // 22.2.1.4 Class ctype_byname specializations.
419 ctype_byname<char>::ctype_byname(const char*, size_t refs);
422 ctype_byname<wchar_t>::ctype_byname(const char*, size_t refs);
424 // 22.2.1.5 Template class codecvt
425 #include <bits/codecvt.h>
428 // 22.2.2 The numeric category.
432 // String literal of acceptable (narrow) input, for num_get.
433 // "0123456789eEabcdfABCDF"
434 static const char _S_atoms[];
445 // Construct and return valid scanf format for floating point types.
447 _S_format_float(const ios_base& __io, char* __fptr, char __mod,
450 // Construct and return valid scanf format for integer types.
452 _S_format_int(const ios_base& __io, char* __fptr, char __mod, char __modl);
456 template<typename _CharT>
457 class numpunct : public locale::facet
461 typedef _CharT char_type;
462 typedef basic_string<_CharT> string_type;
464 static locale::id id;
467 char_type _M_decimal_point;
468 char_type _M_thousands_sep;
469 const char* _M_grouping;
470 const char_type* _M_truename;
471 const char_type* _M_falsename;
475 numpunct(size_t __refs = 0) : locale::facet(__refs)
476 { _M_initialize_numpunct(); }
479 numpunct(__c_locale __cloc, size_t __refs = 0) : locale::facet(__refs)
480 { _M_initialize_numpunct(__cloc); }
483 decimal_point() const
484 { return this->do_decimal_point(); }
487 thousands_sep() const
488 { return this->do_thousands_sep(); }
492 { return this->do_grouping(); }
496 { return this->do_truename(); }
500 { return this->do_falsename(); }
507 do_decimal_point() const
508 { return _M_decimal_point; }
511 do_thousands_sep() const
512 { return _M_thousands_sep; }
516 { return _M_grouping; }
520 { return _M_truename; }
524 { return _M_falsename; }
526 // For use at construction time only.
528 _M_initialize_numpunct(__c_locale __cloc = NULL);
531 template<typename _CharT>
532 locale::id numpunct<_CharT>::id;
535 numpunct<char>::~numpunct();
539 numpunct<char>::_M_initialize_numpunct(__c_locale __cloc);
541 #ifdef _GLIBCPP_USE_WCHAR_T
543 numpunct<wchar_t>::~numpunct();
547 numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc);
550 template<typename _CharT>
551 class numpunct_byname : public numpunct<_CharT>
554 __c_locale _M_c_locale_numpunct;
557 typedef _CharT char_type;
558 typedef basic_string<_CharT> string_type;
561 numpunct_byname(const char* __s, size_t __refs = 0)
562 : numpunct<_CharT>(__refs)
564 _S_create_c_locale(_M_c_locale_numpunct, __s);
565 _M_initialize_numpunct(_M_c_locale_numpunct);
571 { _S_destroy_c_locale(_M_c_locale_numpunct); }
574 template<typename _CharT, typename _InIter>
575 class num_get : public locale::facet, public __num_base
579 typedef _CharT char_type;
580 typedef _InIter iter_type;
582 static locale::id id;
585 num_get(size_t __refs = 0) : locale::facet(__refs) { }
588 get(iter_type __in, iter_type __end, ios_base& __io,
589 ios_base::iostate& __err, bool& __v) const
590 { return this->do_get(__in, __end, __io, __err, __v); }
593 get(iter_type __in, iter_type __end, ios_base& __io,
594 ios_base::iostate& __err, long& __v) const
595 { return this->do_get(__in, __end, __io, __err, __v); }
598 get(iter_type __in, iter_type __end, ios_base& __io,
599 ios_base::iostate& __err, unsigned short& __v) const
600 { return this->do_get(__in, __end, __io, __err, __v); }
603 get(iter_type __in, iter_type __end, ios_base& __io,
604 ios_base::iostate& __err, unsigned int& __v) const
605 { return this->do_get(__in, __end, __io, __err, __v); }
608 get(iter_type __in, iter_type __end, ios_base& __io,
609 ios_base::iostate& __err, unsigned long& __v) const
610 { return this->do_get(__in, __end, __io, __err, __v); }
612 #ifdef _GLIBCPP_USE_LONG_LONG
614 get(iter_type __in, iter_type __end, ios_base& __io,
615 ios_base::iostate& __err, long long& __v) const
616 { return this->do_get(__in, __end, __io, __err, __v); }
619 get(iter_type __in, iter_type __end, ios_base& __io,
620 ios_base::iostate& __err, unsigned long long& __v) const
621 { return this->do_get(__in, __end, __io, __err, __v); }
625 get(iter_type __in, iter_type __end, ios_base& __io,
626 ios_base::iostate& __err, float& __v) const
627 { return this->do_get(__in, __end, __io, __err, __v); }
630 get(iter_type __in, iter_type __end, ios_base& __io,
631 ios_base::iostate& __err, double& __v) const
632 { return this->do_get(__in, __end, __io, __err, __v); }
635 get(iter_type __in, iter_type __end, ios_base& __io,
636 ios_base::iostate& __err, long double& __v) const
637 { return this->do_get(__in, __end, __io, __err, __v); }
640 get(iter_type __in, iter_type __end, ios_base& __io,
641 ios_base::iostate& __err, void*& __v) const
642 { return this->do_get(__in, __end, __io, __err, __v); }
645 virtual ~num_get() { }
648 _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
649 string& __xtrc) const;
652 _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
653 string& __xtrc, int& __base) const;
656 do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
660 do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, long&) const;
663 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
664 unsigned short&) const;
667 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
668 unsigned int&) const;
671 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
672 unsigned long&) const;
674 #ifdef _GLIBCPP_USE_LONG_LONG
676 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
680 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
681 unsigned long long&) const;
685 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
689 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
693 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
697 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
701 template<typename _CharT, typename _InIter>
702 locale::id num_get<_CharT, _InIter>::id;
705 // Partial specialization for istreambuf_iterator, so can use traits_type.
706 template<typename _CharT>
707 class num_get<_CharT, istreambuf_iterator<_CharT> >;
710 _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
711 string& __xtrc) const;
714 _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
715 string& __xtrc, int& __base) const;
718 do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
721 template<typename _CharT, typename _OutIter>
722 class num_put : public locale::facet, public __num_base
726 typedef _CharT char_type;
727 typedef _OutIter iter_type;
729 static locale::id id;
732 num_put(size_t __refs = 0) : locale::facet(__refs) { }
735 put(iter_type __s, ios_base& __f, char_type __fill, bool __v) const
736 { return this->do_put(__s, __f, __fill, __v); }
739 put(iter_type __s, ios_base& __f, char_type __fill, long __v) const
740 { return this->do_put(__s, __f, __fill, __v); }
743 put(iter_type __s, ios_base& __f, char_type __fill,
744 unsigned long __v) const
745 { return this->do_put(__s, __f, __fill, __v); }
747 #ifdef _GLIBCPP_USE_LONG_LONG
749 put(iter_type __s, ios_base& __f, char_type __fill, long long __v) const
750 { return this->do_put(__s, __f, __fill, __v); }
753 put(iter_type __s, ios_base& __f, char_type __fill,
754 unsigned long long __v) const
755 { return this->do_put(__s, __f, __fill, __v); }
759 put(iter_type __s, ios_base& __f, char_type __fill, double __v) const
760 { return this->do_put(__s, __f, __fill, __v); }
763 put(iter_type __s, ios_base& __f, char_type __fill,
764 long double __v) const
765 { return this->do_put(__s, __f, __fill, __v); }
768 put(iter_type __s, ios_base& __f, char_type __fill,
769 const void* __v) const
770 { return this->do_put(__s, __f, __fill, __v); }
773 template<typename _ValueT>
775 _M_convert_float(iter_type, ios_base& __io, char_type __fill,
776 char __mod, _ValueT __v) const;
778 template<typename _ValueT>
780 _M_convert_int(iter_type, ios_base& __io, char_type __fill,
781 char __mod, char __modl, _ValueT __v) const;
784 _M_widen_float(iter_type, ios_base& __io, char_type __fill, char* __cs,
788 _M_widen_int(iter_type, ios_base& __io, char_type __fill, char* __cs,
792 _M_insert(iter_type, ios_base& __io, char_type __fill,
793 const char_type* __ws, int __len) const;
799 do_put(iter_type, ios_base&, char_type __fill, bool __v) const;
802 do_put(iter_type, ios_base&, char_type __fill, long __v) const;
805 do_put(iter_type, ios_base&, char_type __fill, unsigned long) const;
807 #ifdef _GLIBCPP_USE_LONG_LONG
809 do_put(iter_type, ios_base&, char_type __fill, long long __v) const;
812 do_put(iter_type, ios_base&, char_type __fill, unsigned long long) const;
816 do_put(iter_type, ios_base&, char_type __fill, double __v) const;
819 do_put(iter_type, ios_base&, char_type __fill, long double __v) const;
822 do_put(iter_type, ios_base&, char_type __fill, const void* __v) const;
825 template <typename _CharT, typename _OutIter>
826 locale::id num_put<_CharT, _OutIter>::id;
829 template<typename _CharT>
830 class collate : public locale::facet
834 typedef _CharT char_type;
835 typedef basic_string<_CharT> string_type;
838 // Underlying "C" library locale information saved from
839 // initialization, needed by collate_byname as well.
840 __c_locale _M_c_locale_collate;
843 static locale::id id;
846 collate(size_t __refs = 0)
847 : locale::facet(__refs)
848 { _M_c_locale_collate = _S_c_locale; }
851 collate(__c_locale __cloc, size_t __refs = 0)
852 : locale::facet(__refs)
853 { _M_c_locale_collate = _S_clone_c_locale(__cloc); }
856 compare(const _CharT* __lo1, const _CharT* __hi1,
857 const _CharT* __lo2, const _CharT* __hi2) const
858 { return this->do_compare(__lo1, __hi1, __lo2, __hi2); }
861 transform(const _CharT* __lo, const _CharT* __hi) const
862 { return this->do_transform(__lo, __hi); }
865 hash(const _CharT* __lo, const _CharT* __hi) const
866 { return this->do_hash(__lo, __hi); }
868 // Used to abstract out _CharT bits in virtual member functions, below.
870 _M_compare(const _CharT*, const _CharT*) const;
873 _M_transform(_CharT*, const _CharT*, size_t) const;
878 { _S_destroy_c_locale(_M_c_locale_collate); }
881 do_compare(const _CharT* __lo1, const _CharT* __hi1,
882 const _CharT* __lo2, const _CharT* __hi2) const;
885 do_transform(const _CharT* __lo, const _CharT* __hi) const;
888 do_hash(const _CharT* __lo, const _CharT* __hi) const;
891 template<typename _CharT>
892 locale::id collate<_CharT>::id;
897 collate<char>::_M_compare(const char*, const char*) const;
901 collate<char>::_M_transform(char*, const char*, size_t) const;
903 #ifdef _GLIBCPP_USE_WCHAR_T
906 collate<wchar_t>::_M_compare(const wchar_t*, const wchar_t*) const;
910 collate<wchar_t>::_M_transform(wchar_t*, const wchar_t*, size_t) const;
913 template<typename _CharT>
914 class collate_byname : public collate<_CharT>
917 typedef _CharT char_type;
918 typedef basic_string<_CharT> string_type;
921 collate_byname(const char* __s, size_t __refs = 0)
922 : collate<_CharT>(__refs)
924 _S_destroy_c_locale(_M_c_locale_collate);
925 _S_create_c_locale(_M_c_locale_collate, __s);
930 ~collate_byname() { }
937 enum dateorder { no_order, dmy, mdy, ymd, ydm };
940 template<typename _CharT>
941 class __timepunct : public locale::facet
945 typedef _CharT __char_type;
946 typedef basic_string<_CharT> __string_type;
948 static locale::id id;
950 // List of all known timezones, with GMT first.
951 static const _CharT* _S_timezones[14];
954 __c_locale _M_c_locale_timepunct;
955 char* _M_name_timepunct;
956 const _CharT* _M_date_format;
957 const _CharT* _M_date_era_format;
958 const _CharT* _M_time_format;
959 const _CharT* _M_time_era_format;
960 const _CharT* _M_date_time_format;
961 const _CharT* _M_date_time_era_format;
964 const _CharT* _M_am_pm_format;
966 // Day names, starting with "C"'s Sunday.
967 const _CharT* _M_day1;
968 const _CharT* _M_day2;
969 const _CharT* _M_day3;
970 const _CharT* _M_day4;
971 const _CharT* _M_day5;
972 const _CharT* _M_day6;
973 const _CharT* _M_day7;
975 // Abbreviated day names, starting with "C"'s Sun.
976 const _CharT* _M_day_a1;
977 const _CharT* _M_day_a2;
978 const _CharT* _M_day_a3;
979 const _CharT* _M_day_a4;
980 const _CharT* _M_day_a5;
981 const _CharT* _M_day_a6;
982 const _CharT* _M_day_a7;
984 // Month names, starting with "C"'s January.
985 const _CharT* _M_month01;
986 const _CharT* _M_month02;
987 const _CharT* _M_month03;
988 const _CharT* _M_month04;
989 const _CharT* _M_month05;
990 const _CharT* _M_month06;
991 const _CharT* _M_month07;
992 const _CharT* _M_month08;
993 const _CharT* _M_month09;
994 const _CharT* _M_month10;
995 const _CharT* _M_month11;
996 const _CharT* _M_month12;
998 // Abbreviated month names, starting with "C"'s Jan.
999 const _CharT* _M_month_a01;
1000 const _CharT* _M_month_a02;
1001 const _CharT* _M_month_a03;
1002 const _CharT* _M_month_a04;
1003 const _CharT* _M_month_a05;
1004 const _CharT* _M_month_a06;
1005 const _CharT* _M_month_a07;
1006 const _CharT* _M_month_a08;
1007 const _CharT* _M_month_a09;
1008 const _CharT* _M_month_a10;
1009 const _CharT* _M_month_a11;
1010 const _CharT* _M_month_a12;
1014 __timepunct(size_t __refs = 0);
1017 __timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0);
1020 _M_put(_CharT* __s, size_t __maxlen, const _CharT* __format,
1021 const tm* __tm) const;
1024 _M_date_formats(const _CharT** __date) const
1026 // Always have default first.
1027 __date[0] = _M_date_format;
1028 __date[1] = _M_date_era_format;
1032 _M_time_formats(const _CharT** __time) const
1034 // Always have default first.
1035 __time[0] = _M_time_format;
1036 __time[1] = _M_time_era_format;
1040 _M_ampm(const _CharT** __ampm) const
1047 _M_date_time_formats(const _CharT** __dt) const
1049 // Always have default first.
1050 __dt[0] = _M_date_time_format;
1051 __dt[1] = _M_date_time_era_format;
1055 _M_days(const _CharT** __days) const
1057 __days[0] = _M_day1;
1058 __days[1] = _M_day2;
1059 __days[2] = _M_day3;
1060 __days[3] = _M_day4;
1061 __days[4] = _M_day5;
1062 __days[5] = _M_day6;
1063 __days[6] = _M_day7;
1067 _M_days_abbreviated(const _CharT** __days) const
1069 __days[0] = _M_day_a1;
1070 __days[1] = _M_day_a2;
1071 __days[2] = _M_day_a3;
1072 __days[3] = _M_day_a4;
1073 __days[4] = _M_day_a5;
1074 __days[5] = _M_day_a6;
1075 __days[6] = _M_day_a7;
1079 _M_months(const _CharT** __months) const
1081 __months[0] = _M_month01;
1082 __months[1] = _M_month02;
1083 __months[2] = _M_month03;
1084 __months[3] = _M_month04;
1085 __months[4] = _M_month05;
1086 __months[5] = _M_month06;
1087 __months[6] = _M_month07;
1088 __months[7] = _M_month08;
1089 __months[8] = _M_month09;
1090 __months[9] = _M_month10;
1091 __months[10] = _M_month11;
1092 __months[11] = _M_month12;
1096 _M_months_abbreviated(const _CharT** __months) const
1098 __months[0] = _M_month_a01;
1099 __months[1] = _M_month_a02;
1100 __months[2] = _M_month_a03;
1101 __months[3] = _M_month_a04;
1102 __months[4] = _M_month_a05;
1103 __months[5] = _M_month_a06;
1104 __months[6] = _M_month_a07;
1105 __months[7] = _M_month_a08;
1106 __months[8] = _M_month_a09;
1107 __months[9] = _M_month_a10;
1108 __months[10] = _M_month_a11;
1109 __months[11] = _M_month_a12;
1116 // For use at construction time only.
1118 _M_initialize_timepunct(__c_locale __cloc = NULL);
1121 template<typename _CharT>
1122 locale::id __timepunct<_CharT>::id;
1127 __timepunct<char>::_S_timezones[14];
1131 __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc);
1135 __timepunct<char>::_M_put(char*, size_t, const char*, const tm*) const;
1137 #ifdef _GLIBCPP_USE_WCHAR_T
1140 __timepunct<wchar_t>::_S_timezones[14];
1144 __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc);
1148 __timepunct<wchar_t>::_M_put(wchar_t*, size_t, const wchar_t*,
1153 template<typename _CharT>
1154 const _CharT* __timepunct<_CharT>::_S_timezones[14];
1156 // Include host and configuration specific timepunct functions.
1157 #include <bits/time_members.h>
1159 template<typename _CharT, typename _InIter>
1160 class time_get : public locale::facet, public time_base
1164 typedef _CharT char_type;
1165 typedef _InIter iter_type;
1166 typedef basic_string<_CharT> __string_type;
1168 static locale::id id;
1171 time_get(size_t __refs = 0)
1172 : locale::facet (__refs) { }
1176 { return this->do_date_order(); }
1179 get_time(iter_type __beg, iter_type __end, ios_base& __io,
1180 ios_base::iostate& __err, tm* __tm) const
1181 { return this->do_get_time(__beg, __end, __io, __err, __tm); }
1184 get_date(iter_type __beg, iter_type __end, ios_base& __io,
1185 ios_base::iostate& __err, tm* __tm) const
1186 { return this->do_get_date(__beg, __end, __io, __err, __tm); }
1189 get_weekday(iter_type __beg, iter_type __end, ios_base& __io,
1190 ios_base::iostate& __err, tm* __tm) const
1191 { return this->do_get_weekday(__beg, __end, __io, __err, __tm); }
1194 get_monthname(iter_type __beg, iter_type __end, ios_base& __io,
1195 ios_base::iostate& __err, tm* __tm) const
1196 { return this->do_get_monthname(__beg, __end, __io, __err, __tm); }
1199 get_year(iter_type __beg, iter_type __end, ios_base& __io,
1200 ios_base::iostate& __err, tm* __tm) const
1201 { return this->do_get_year(__beg, __end, __io, __err, __tm); }
1208 do_date_order() const;
1211 do_get_time(iter_type __beg, iter_type __end, ios_base& __io,
1212 ios_base::iostate& __err, tm* __tm) const;
1215 do_get_date(iter_type __beg, iter_type __end, ios_base& __io,
1216 ios_base::iostate& __err, tm* __tm) const;
1219 do_get_weekday(iter_type __beg, iter_type __end, ios_base&,
1220 ios_base::iostate& __err, tm* __tm) const;
1223 do_get_monthname(iter_type __beg, iter_type __end, ios_base&,
1224 ios_base::iostate& __err, tm* __tm) const;
1227 do_get_year(iter_type __beg, iter_type __end, ios_base& __io,
1228 ios_base::iostate& __err, tm* __tm) const;
1230 // Extract numeric component of length __len.
1232 _M_extract_num(iter_type& __beg, iter_type& __end, int& __member,
1233 int __min, int __max, size_t __len,
1234 const ctype<_CharT>& __ctype,
1235 ios_base::iostate& __err) const;
1237 // Extract day or month name, or any unique array of string
1238 // literals in a const _CharT* array.
1240 _M_extract_name(iter_type& __beg, iter_type& __end, int& __member,
1241 const _CharT** __names, size_t __indexlen,
1242 ios_base::iostate& __err) const;
1244 // Extract on a component-by-component basis, via __format argument.
1246 _M_extract_via_format(iter_type& __beg, iter_type& __end, ios_base& __io,
1247 ios_base::iostate& __err, tm* __tm,
1248 const _CharT* __format) const;
1251 template<typename _CharT, typename _InIter>
1252 locale::id time_get<_CharT, _InIter>::id;
1254 template<typename _CharT, typename _InIter>
1255 class time_get_byname : public time_get<_CharT, _InIter>
1259 typedef _CharT char_type;
1260 typedef _InIter iter_type;
1263 time_get_byname(const char*, size_t __refs = 0)
1264 : time_get<_CharT, _InIter>(__refs) { }
1268 ~time_get_byname() { }
1271 template<typename _CharT, typename _OutIter>
1272 class time_put : public locale::facet, public time_base
1276 typedef _CharT char_type;
1277 typedef _OutIter iter_type;
1279 static locale::id id;
1282 time_put(size_t __refs = 0)
1283 : locale::facet(__refs) { }
1286 put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
1287 const _CharT* __beg, const _CharT* __end) const;
1290 put(iter_type __s, ios_base& __io, char_type __fill,
1291 const tm* __tm, char __format, char __mod = 0) const
1292 { return this->do_put(__s, __io, __fill, __tm, __format, __mod); }
1300 do_put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
1301 char __format, char __mod) const;
1304 template<typename _CharT, typename _OutIter>
1305 locale::id time_put<_CharT, _OutIter>::id;
1307 template<typename _CharT, typename _OutIter>
1308 class time_put_byname : public time_put<_CharT, _OutIter>
1312 typedef _CharT char_type;
1313 typedef _OutIter iter_type;
1316 time_put_byname(const char* /*__s*/, size_t __refs = 0)
1317 : time_put<_CharT, _OutIter>(__refs)
1322 ~time_put_byname() { }
1329 enum part { none, space, symbol, sign, value };
1330 struct pattern { char field[4]; };
1332 static const pattern _S_default_pattern;
1334 // Construct and return valid pattern consisting of some combination of:
1335 // space none symbol sign value
1337 _S_construct_pattern(char __precedes, char __space, char __posn);
1340 template<typename _CharT, bool _Intl>
1341 class moneypunct : public locale::facet, public money_base
1345 typedef _CharT char_type;
1346 typedef basic_string<_CharT> string_type;
1348 static const bool intl = _Intl;
1349 static locale::id id;
1352 const char* _M_grouping;
1353 char_type _M_decimal_point;
1354 char_type _M_thousands_sep;
1355 const char_type* _M_curr_symbol;
1356 const char_type* _M_positive_sign;
1357 const char_type* _M_negative_sign;
1359 pattern _M_pos_format;
1360 pattern _M_neg_format;
1364 moneypunct(size_t __refs = 0) : locale::facet(__refs)
1365 { _M_initialize_moneypunct(); }
1368 moneypunct(__c_locale __cloc, const char* __s, size_t __refs = 0)
1369 : locale::facet(__refs)
1370 { _M_initialize_moneypunct(__cloc, __s); }
1373 decimal_point() const
1374 { return this->do_decimal_point(); }
1377 thousands_sep() const
1378 { return this->do_thousands_sep(); }
1382 { return this->do_grouping(); }
1386 { return this->do_curr_symbol(); }
1389 positive_sign() const
1390 { return this->do_positive_sign(); }
1393 negative_sign() const
1394 { return this->do_negative_sign(); }
1398 { return this->do_frac_digits(); }
1402 { return this->do_pos_format(); }
1406 { return this->do_neg_format(); }
1413 do_decimal_point() const
1414 { return _M_decimal_point; }
1417 do_thousands_sep() const
1418 { return _M_thousands_sep; }
1422 { return _M_grouping; }
1425 do_curr_symbol() const
1426 { return _M_curr_symbol; }
1429 do_positive_sign() const
1430 { return _M_positive_sign; }
1433 do_negative_sign() const
1434 { return _M_negative_sign; }
1437 do_frac_digits() const
1438 { return _M_frac_digits; }
1441 do_pos_format() const
1442 { return _M_pos_format; }
1445 do_neg_format() const
1446 { return _M_neg_format; }
1448 // For use at construction time only.
1450 _M_initialize_moneypunct(__c_locale __cloc = NULL,
1451 const char* __name = NULL);
1454 template<typename _CharT, bool _Intl>
1455 locale::id moneypunct<_CharT, _Intl>::id;
1457 template<typename _CharT, bool _Intl>
1458 const bool moneypunct<_CharT, _Intl>::intl;
1461 moneypunct<char, true>::~moneypunct();
1464 moneypunct<char, false>::~moneypunct();
1468 moneypunct<char, true>::_M_initialize_moneypunct(__c_locale, const char*);
1472 moneypunct<char, false>::_M_initialize_moneypunct(__c_locale, const char*);
1474 #ifdef _GLIBCPP_USE_WCHAR_T
1476 moneypunct<wchar_t, true>::~moneypunct();
1479 moneypunct<wchar_t, false>::~moneypunct();
1483 moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale,
1488 moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale,
1492 template<typename _CharT, bool _Intl>
1493 class moneypunct_byname : public moneypunct<_CharT, _Intl>
1495 __c_locale _M_c_locale_moneypunct;
1498 typedef _CharT char_type;
1499 typedef basic_string<_CharT> string_type;
1501 static const bool intl = _Intl;
1504 moneypunct_byname(const char* __s, size_t __refs = 0)
1505 : moneypunct<_CharT, _Intl>(__refs)
1507 _S_create_c_locale(_M_c_locale_moneypunct, __s);
1508 _M_initialize_moneypunct(_M_c_locale_moneypunct);
1513 ~moneypunct_byname()
1514 { _S_destroy_c_locale(_M_c_locale_moneypunct); }
1517 template<typename _CharT, bool _Intl>
1518 const bool moneypunct_byname<_CharT, _Intl>::intl;
1520 template<typename _CharT, typename _InIter>
1521 class money_get : public locale::facet
1525 typedef _CharT char_type;
1526 typedef _InIter iter_type;
1527 typedef basic_string<_CharT> string_type;
1529 static locale::id id;
1532 money_get(size_t __refs = 0) : locale::facet(__refs) { }
1535 get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1536 ios_base::iostate& __err, long double& __units) const
1537 { return this->do_get(__s, __end, __intl, __io, __err, __units); }
1540 get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1541 ios_base::iostate& __err, string_type& __digits) const
1542 { return this->do_get(__s, __end, __intl, __io, __err, __digits); }
1549 do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1550 ios_base::iostate& __err, long double& __units) const;
1553 do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1554 ios_base::iostate& __err, string_type& __digits) const;
1557 template<typename _CharT, typename _InIter>
1558 locale::id money_get<_CharT, _InIter>::id;
1560 template<typename _CharT, typename _OutIter>
1561 class money_put : public locale::facet
1564 typedef _CharT char_type;
1565 typedef _OutIter iter_type;
1566 typedef basic_string<_CharT> string_type;
1568 static locale::id id;
1571 money_put(size_t __refs = 0) : locale::facet(__refs) { }
1574 put(iter_type __s, bool __intl, ios_base& __io,
1575 char_type __fill, long double __units) const
1576 { return this->do_put(__s, __intl, __io, __fill, __units); }
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); }
1588 do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1589 long double __units) const;
1592 do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1593 const string_type& __digits) const;
1596 template<typename _CharT, typename _OutIter>
1597 locale::id money_put<_CharT, _OutIter>::id;
1600 struct messages_base
1602 typedef int catalog;
1605 template<typename _CharT>
1606 class messages : public locale::facet, public messages_base
1610 typedef _CharT char_type;
1611 typedef basic_string<_CharT> string_type;
1614 // Underlying "C" library locale information saved from
1615 // initialization, needed by messages_byname as well.
1616 __c_locale _M_c_locale_messages;
1617 char* _M_name_messages;
1620 static locale::id id;
1623 messages(size_t __refs = 0);
1627 messages(__c_locale __cloc, const char* __s, size_t __refs = 0);
1630 open(const basic_string<char>& __s, const locale& __loc) const
1631 { return this->do_open(__s, __loc); }
1633 // Non-standard and unorthodox, yet effective.
1635 open(const basic_string<char>&, const locale&, const char*) const;
1638 get(catalog __c, int __set, int __msgid, const string_type& __s) const
1639 { return this->do_get(__c, __set, __msgid, __s); }
1642 close(catalog __c) const
1643 { return this->do_close(__c); }
1650 do_open(const basic_string<char>&, const locale&) const;
1653 do_get(catalog, int, int, const string_type& __dfault) const;
1656 do_close(catalog) const;
1658 // Returns a locale and codeset-converted string, given a char* message.
1660 _M_convert_to_char(const string_type& __msg) const
1663 return reinterpret_cast<char*>(const_cast<_CharT*>(__msg.c_str()));
1666 // Returns a locale and codeset-converted string, given a char* message.
1668 _M_convert_from_char(char* __msg) const
1670 // Length of message string without terminating null.
1671 size_t __len = char_traits<char>::length(__msg) - 1;
1673 // "everybody can easily convert the string using
1674 // mbsrtowcs/wcsrtombs or with iconv()"
1676 // Convert char* to _CharT in locale used to open catalog.
1677 // XXX need additional template parameter on messages class for this..
1678 // typedef typename codecvt<char, _CharT, _StateT> __codecvt_type;
1679 typedef typename codecvt<char, _CharT, mbstate_t> __codecvt_type;
1681 __codecvt_type::state_type __state;
1682 // XXX may need to initialize state.
1683 //initialize_state(__state._M_init());
1686 // XXX what size for this string?
1687 _CharT* __to = static_cast<_CharT*>(__builtin_alloca(__len + 1));
1688 const __codecvt_type& __cvt = use_facet<__codecvt_type>(_M_locale_conv);
1689 __cvt.out(__state, __msg, __msg + __len, __from_next,
1690 __to, __to + __len + 1, __to_next);
1691 return string_type(__to);
1694 typedef ctype<_CharT> __ctype_type;
1695 // const __ctype_type& __cvt = use_facet<__ctype_type>(_M_locale_msg);
1696 const __ctype_type& __cvt = use_facet<__ctype_type>(locale());
1697 // XXX Again, proper length of converted string an issue here.
1698 // For now, assume the converted length is not larger.
1699 _CharT* __dest = static_cast<_CharT*>(__builtin_alloca(__len + 1));
1700 __cvt.widen(__msg, __msg + __len, __dest);
1701 return basic_string<_CharT>(__dest);
1703 return string_type();
1707 template<typename _CharT>
1708 locale::id messages<_CharT>::id;
1710 // Specializations for required instantiations.
1713 messages<char>::do_get(catalog, int, int, const string&) const;
1715 #ifdef _GLIBCPP_USE_WCHAR_T
1718 messages<wchar_t>::do_get(catalog, int, int, const wstring&) const;
1721 template<typename _CharT>
1722 class messages_byname : public messages<_CharT>
1725 typedef _CharT char_type;
1726 typedef basic_string<_CharT> string_type;
1729 messages_byname(const char* __s, size_t __refs = 0);
1737 // Include host and configuration specific messages functions.
1738 #include <bits/messages_members.h>
1741 // Subclause convenience interfaces, inlines.
1742 // NB: These are inline because, when used in a loop, some compilers
1743 // can hoist the body out of the loop; then it's just as fast as the
1744 // C is*() function.
1745 template<typename _CharT>
1747 isspace(_CharT __c, const locale& __loc)
1748 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c); }
1750 template<typename _CharT>
1752 isprint(_CharT __c, const locale& __loc)
1753 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c); }
1755 template<typename _CharT>
1757 iscntrl(_CharT __c, const locale& __loc)
1758 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c); }
1760 template<typename _CharT>
1762 isupper(_CharT __c, const locale& __loc)
1763 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c); }
1765 template<typename _CharT>
1766 inline bool islower(_CharT __c, const locale& __loc)
1767 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c); }
1769 template<typename _CharT>
1771 isalpha(_CharT __c, const locale& __loc)
1772 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c); }
1774 template<typename _CharT>
1776 isdigit(_CharT __c, const locale& __loc)
1777 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c); }
1779 template<typename _CharT>
1781 ispunct(_CharT __c, const locale& __loc)
1782 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c); }
1784 template<typename _CharT>
1786 isxdigit(_CharT __c, const locale& __loc)
1787 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c); }
1789 template<typename _CharT>
1791 isalnum(_CharT __c, const locale& __loc)
1792 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c); }
1794 template<typename _CharT>
1796 isgraph(_CharT __c, const locale& __loc)
1797 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c); }
1799 template<typename _CharT>
1801 toupper(_CharT __c, const locale& __loc)
1802 { return use_facet<ctype<_CharT> >(__loc).toupper(__c); }
1804 template<typename _CharT>
1806 tolower(_CharT __c, const locale& __loc)
1807 { return use_facet<ctype<_CharT> >(__loc).tolower(__c); }