]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/config/locale/c_locale_gnu.cc
Implement std::collate.
[thirdparty/gcc.git] / libstdc++-v3 / config / locale / c_locale_gnu.cc
1
2 // Wrapper for underlying C-language localization -*- C++ -*-
3
4 // Copyright (C) 2001 Free Software Foundation, Inc.
5 //
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)
10 // any later version.
11
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.
16
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,
20 // USA.
21
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.
30
31 //
32 // ISO C++ 14882: 22.8 Standard locale categories.
33 //
34
35 // Written by Benjamin Kosnik <bkoz@redhat.com>
36
37 #include <locale>
38 #include <stdexcept>
39 #include <langinfo.h>
40
41 namespace std
42 {
43 void
44 locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s)
45 {
46 // XXX
47 // perhaps locale::categories could be made equivalent to LC_*_MASK
48 // _M_c_locale = __newlocale(1 << LC_ALL, __str.c_str(), NULL);
49 // _M_c_locale = __newlocale(locale::all, __str.c_str(), NULL);
50 __cloc = __newlocale(1 << LC_ALL, __s, 0);
51 if (!__cloc)
52 {
53 // This named locale is not supported by the underlying OS.
54 throw runtime_error("attempt to create locale from unknown name");
55 }
56 }
57
58 void
59 locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
60 {
61 if (__cloc)
62 __freelocale(__cloc);
63 }
64
65 __c_locale
66 locale::facet::_S_clone_c_locale(__c_locale& __cloc)
67 { return __duplocale(__cloc); }
68
69 template<>
70 void
71 numpunct<char>::_M_initialize_numpunct(__c_locale __cloc)
72 {
73 if (!__cloc)
74 {
75 // "C" locale
76 _M_decimal_point = '.';
77 _M_thousands_sep = ',';
78 _M_grouping = "";
79 }
80 else
81 {
82 // Named locale.
83 _M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc));
84 _M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc));
85 _M_grouping = __nl_langinfo_l(GROUPING, __cloc);
86 }
87 // NB: There is no way to extact this info from posix locales.
88 // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
89 _M_truename = "true";
90 // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
91 _M_falsename = "false";
92 }
93
94 #ifdef _GLIBCPP_USE_WCHAR_T
95 template<>
96 void
97 numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc)
98 {
99 if (!__cloc)
100 {
101 // "C" locale
102 _M_decimal_point = L'.';
103 _M_thousands_sep = L',';
104 _M_grouping = "";
105 }
106 else
107 {
108 // Named locale.
109 _M_decimal_point = reinterpret_cast<wchar_t>(__nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc));
110 _M_thousands_sep = reinterpret_cast<wchar_t>(__nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC,__cloc));
111 _M_grouping = __nl_langinfo_l(GROUPING, __cloc);
112 }
113 // NB: There is no way to extact this info from posix locales.
114 // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
115 _M_truename = L"true";
116 // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
117 _M_falsename = L"false";
118 }
119 #endif
120
121 template<>
122 void
123 moneypunct<char>::_M_initialize_moneypunct(__c_locale __cloc)
124 {
125 if (!__cloc)
126 {
127 // "C" locale
128 _M_decimal_point = '.';
129 _M_thousands_sep = ',';
130 _M_grouping = "";
131 _M_curr_symbol = string_type();
132 _M_positive_sign = string_type();
133 _M_negative_sign = string_type();
134 _M_frac_digits = 0;
135 _M_pos_format = money_base::_S_default_pattern;
136 _M_neg_format = money_base::_S_default_pattern;
137 }
138 else
139 {
140 // Named locale.
141 _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc));
142 _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc));
143 _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
144 _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
145 _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
146 if (intl)
147 {
148 _M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
149 _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc));
150 char __ppreceeds = *(__nl_langinfo_l(__INT_P_CS_PRECEDES,
151 __cloc));
152 char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
153 char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
154 _M_pos_format = _S_construct_pattern(__ppreceeds, __pspace,
155 __pposn);
156 char __npreceeds = *(__nl_langinfo_l(__INT_N_CS_PRECEDES,
157 __cloc));
158 char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
159 char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
160 _M_neg_format = _S_construct_pattern(__npreceeds, __nspace,
161 __nposn);
162 }
163 else
164 {
165 _M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
166 _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
167 char __ppreceeds = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
168 char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
169 char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
170 _M_pos_format = _S_construct_pattern(__ppreceeds, __pspace,
171 __pposn);
172 char __npreceeds = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
173 char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
174 char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
175 _M_neg_format = _S_construct_pattern(__npreceeds, __nspace,
176 __nposn);
177 }
178 }
179 }
180
181 #ifdef _GLIBCPP_USE_WCHAR_T
182 template<>
183 void
184 moneypunct<wchar_t>::_M_initialize_moneypunct(__c_locale /*__cloc*/)
185 {
186 // XXX implement
187 // "C" locale
188 _M_decimal_point = L'.';
189 _M_thousands_sep = L',';
190 _M_grouping = "";
191 _M_curr_symbol = string_type();
192 _M_positive_sign = string_type();
193 _M_negative_sign = string_type();
194 _M_frac_digits = 0;
195 _M_pos_format = money_base::_S_default_pattern;
196 _M_neg_format = money_base::_S_default_pattern;
197 }
198 #endif
199 } // namespace std
200
201
202
203
204
205
206
207
208
209