OSDN Git Service

2001-05-01 Tom Browder <tbrowder@home.com>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / config / c_locale_gnu.cc
1 // Wrapper for underlying C-language localization -*- C++ -*-
2
3 // Copyright (C) 2001 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 2, 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 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING.  If not, write to the Free
18 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19 // USA.
20
21 // As a special exception, you may use this file as part of a free software
22 // library without restriction.  Specifically, if other files instantiate
23 // templates or use macros or inline functions from this file, or you compile
24 // this file and link it with other files to produce an executable, this
25 // file does not by itself cause the resulting executable to be covered by
26 // the GNU General Public License.  This exception does not however
27 // invalidate any other reasons why the executable file might be covered by
28 // the GNU General Public License.
29
30 //
31 // ISO C++ 14882: 22.8  Standard locale categories.
32 //
33
34 // Written by Benjamin Kosnik <bkoz@redhat.com>
35
36 #include <locale>
37 #include <stdexcept>
38 #include <langinfo.h>
39
40 namespace std 
41 {
42   void
43   locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s)
44   {
45     // XXX
46     // perhaps locale::categories could be made equivalent to LC_*_MASK
47     //    _M_c_locale = __newlocale(1 << LC_ALL, __str.c_str(), NULL);
48     //    _M_c_locale = __newlocale(locale::all, __str.c_str(), NULL);
49     __cloc = __newlocale(LC_ALL, __s, NULL);
50     if (!__cloc)
51       {
52         // This named locale is not supported by the underlying OS.
53         throw runtime_error("attempt to create locale from unknown name");
54       }
55   }
56   
57   void
58   locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
59   {
60     if (__cloc)
61       __freelocale(__cloc); 
62   }
63
64   template<> 
65     void
66     numpunct<char>::_M_initialize_numpunct(__c_locale __cloc)
67     {
68       if (!__cloc)
69         {
70           // "C" locale
71           _M_decimal_point = '.';
72           _M_thousands_sep = ',';
73           _M_grouping = "";
74         }
75       else
76         {
77           // Named locale.
78           _M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc));
79           _M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc));
80           _M_grouping = __nl_langinfo_l(GROUPING, __cloc);
81         }
82       // NB: There is no way to extact this info from posix locales.
83       // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
84       _M_truename = "true";
85       // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
86       _M_falsename = "false";
87     }
88       
89 #ifdef _GLIBCPP_USE_WCHAR_T
90   template<> 
91     void
92     numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc)
93     {
94       if (!__cloc)
95         {
96           // "C" locale
97           _M_decimal_point = L'.';
98           _M_thousands_sep = L',';
99           _M_grouping = "";
100         }
101       else
102         {
103           // Named locale.
104           _M_decimal_point = reinterpret_cast<wchar_t>(__nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc));
105           _M_thousands_sep = reinterpret_cast<wchar_t>(__nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC,__cloc));
106           _M_grouping = __nl_langinfo_l(GROUPING, __cloc);
107         }
108       // NB: There is no way to extact this info from posix locales.
109       // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
110       _M_truename = L"true";
111       // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
112       _M_falsename = L"false";
113     }
114 #endif
115
116   template<> 
117     void
118     moneypunct<char>::_M_initialize_moneypunct(__c_locale __cloc)
119     {
120       if (!__cloc)
121         {
122           // "C" locale
123           _M_decimal_point = '.';
124           _M_thousands_sep = ',';
125           _M_grouping = "";
126           _M_curr_symbol = string_type();
127           _M_positive_sign = string_type();
128           _M_negative_sign = string_type();
129           _M_frac_digits = 0;
130           _M_pos_format = money_base::_S_default_pattern;
131           _M_neg_format = money_base::_S_default_pattern;
132         }
133       else
134         {
135           // Named locale.
136           _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc));
137           _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc));
138           _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
139           _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
140           _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
141           if (intl)
142             {
143               _M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
144               _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc));
145               char __ppreceeds = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, 
146                                                    __cloc));
147               char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
148               char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
149               _M_pos_format = _S_construct_pattern(__ppreceeds, __pspace, 
150                                                    __pposn);
151               char __npreceeds = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, 
152                                                    __cloc));
153               char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
154               char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
155               _M_neg_format = _S_construct_pattern(__npreceeds, __nspace, 
156                                                    __nposn);
157             }
158           else
159             {
160               _M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
161               _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
162               char __ppreceeds = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
163               char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
164               char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
165               _M_pos_format = _S_construct_pattern(__ppreceeds, __pspace, 
166                                                    __pposn);
167               char __npreceeds = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
168               char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
169               char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
170               _M_neg_format = _S_construct_pattern(__npreceeds, __nspace, 
171                                                    __nposn);
172             }
173         }
174     }
175
176 #ifdef _GLIBCPP_USE_WCHAR_T
177   template<> 
178     void
179     moneypunct<wchar_t>::_M_initialize_moneypunct(__c_locale /*__cloc*/)
180     {
181       // XXX implement
182       // "C" locale
183       _M_decimal_point = L'.';
184       _M_thousands_sep = L',';
185       _M_grouping = "";
186       _M_curr_symbol = string_type();
187       _M_positive_sign = string_type();
188       _M_negative_sign = string_type();
189       _M_frac_digits = 0;
190       _M_pos_format = money_base::_S_default_pattern;
191       _M_neg_format = money_base::_S_default_pattern;
192     }
193 #endif
194 }  // namespace std
195
196
197
198
199
200
201
202
203
204