1 // Locale support -*- C++ -*-
2 
3 // Copyright (C) 1999, 2000, 2001, 2002, 2003 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.1  Locales
32 //
33 
34 #include <cstdlib>
35 #include <clocale>
36 #include <cstring>
37 #include <locale>
38 
39 namespace std
40 {
41   // moneypunct, money_get, and money_put
42   template class moneypunct<char, false>;
43   template class moneypunct<char, true>;
44   template class moneypunct_byname<char, false>;
45   template class moneypunct_byname<char, true>;
46   template class money_get<char, istreambuf_iterator<char> >;
47   template class money_put<char, ostreambuf_iterator<char> >;
48   template class __locale_cache<numpunct<char> >;
49 
50 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
51   template class moneypunct<wchar_t, false>;
52   template class moneypunct<wchar_t, true>;
53   template class moneypunct_byname<wchar_t, false>;
54   template class moneypunct_byname<wchar_t, true>;
55   template class money_get<wchar_t, istreambuf_iterator<wchar_t> >;
56   template class money_put<wchar_t, ostreambuf_iterator<wchar_t> >;
57   template class __locale_cache<numpunct<wchar_t> >;
58 #endif
59 
60   // numpunct, numpunct_byname, num_get, and num_put
61   template class numpunct<char>;
62   template class numpunct_byname<char>;
63   template class num_get<char, istreambuf_iterator<char> >;
64   template class num_put<char, ostreambuf_iterator<char> >;
65   template
66     ostreambuf_iterator<char>
67     num_put<char, ostreambuf_iterator<char> >::
68     _M_convert_int(ostreambuf_iterator<char>, ios_base&, char,
69 		   long) const;
70 
71   template
72     ostreambuf_iterator<char>
73     num_put<char, ostreambuf_iterator<char> >::
74     _M_convert_int(ostreambuf_iterator<char>, ios_base&, char,
75 		   unsigned long) const;
76 
77 #ifdef _GLIBCPP_USE_LONG_LONG
78   template
79     ostreambuf_iterator<char>
80     num_put<char, ostreambuf_iterator<char> >::
81     _M_convert_int(ostreambuf_iterator<char>, ios_base&, char,
82 		   long long) const;
83 
84   template
85     ostreambuf_iterator<char>
86     num_put<char, ostreambuf_iterator<char> >::
87     _M_convert_int(ostreambuf_iterator<char>, ios_base&, char,
88 		   unsigned long long) const;
89 #endif
90 
91   template
92     ostreambuf_iterator<char>
93     num_put<char, ostreambuf_iterator<char> >::
94     _M_convert_float(ostreambuf_iterator<char>, ios_base&, char, char,
95 		     double) const;
96 
97   template
98     ostreambuf_iterator<char>
99     num_put<char, ostreambuf_iterator<char> >::
100     _M_convert_float(ostreambuf_iterator<char>, ios_base&, char, char,
101 		     long double) const;
102 
103 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
104   template class numpunct<wchar_t>;
105   template class numpunct_byname<wchar_t>;
106   template class num_get<wchar_t, istreambuf_iterator<wchar_t> >;
107   template class num_put<wchar_t, ostreambuf_iterator<wchar_t> >;
108 
109   template
110     ostreambuf_iterator<wchar_t>
111     num_put<wchar_t, ostreambuf_iterator<wchar_t> >::
112     _M_convert_int(ostreambuf_iterator<wchar_t>, ios_base&, wchar_t,
113 		   long) const;
114 
115   template
116     ostreambuf_iterator<wchar_t>
117     num_put<wchar_t, ostreambuf_iterator<wchar_t> >::
118     _M_convert_int(ostreambuf_iterator<wchar_t>, ios_base&, wchar_t,
119 		   unsigned long) const;
120 
121 #ifdef _GLIBCPP_USE_LONG_LONG
122   template
123     ostreambuf_iterator<wchar_t>
124     num_put<wchar_t, ostreambuf_iterator<wchar_t> >::
125     _M_convert_int(ostreambuf_iterator<wchar_t>, ios_base&, wchar_t,
126 		   long long) const;
127 
128   template
129     ostreambuf_iterator<wchar_t>
130     num_put<wchar_t, ostreambuf_iterator<wchar_t> >::
131     _M_convert_int(ostreambuf_iterator<wchar_t>, ios_base&, wchar_t,
132 		   unsigned long long) const;
133 #endif
134 
135   template
136     ostreambuf_iterator<wchar_t>
137     num_put<wchar_t, ostreambuf_iterator<wchar_t> >::
138     _M_convert_float(ostreambuf_iterator<wchar_t>, ios_base&, wchar_t, char,
139 		     double) const;
140 
141   template
142     ostreambuf_iterator<wchar_t>
143     num_put<wchar_t, ostreambuf_iterator<wchar_t> >::
144     _M_convert_float(ostreambuf_iterator<wchar_t>, ios_base&, wchar_t, char,
145 		     long double) const;
146 #endif
147 
148 #if 1
149       // XXX GLIBCXX_ABI Deprecated, compatibility only.
150   template
151     ostreambuf_iterator<char>
152     num_put<char, ostreambuf_iterator<char> >::
153     _M_convert_int(ostreambuf_iterator<char>, ios_base&, char, char, char,
154 		   long) const;
155 
156   template
157     ostreambuf_iterator<char>
158     num_put<char, ostreambuf_iterator<char> >::
159     _M_convert_int(ostreambuf_iterator<char>, ios_base&, char, char, char,
160 		   unsigned long) const;
161 
162 #ifdef _GLIBCPP_USE_LONG_LONG
163   template
164     ostreambuf_iterator<char>
165     num_put<char, ostreambuf_iterator<char> >::
166     _M_convert_int(ostreambuf_iterator<char>, ios_base&, char, char, char,
167 		   long long) const;
168 
169   template
170     ostreambuf_iterator<char>
171     num_put<char, ostreambuf_iterator<char> >::
172     _M_convert_int(ostreambuf_iterator<char>, ios_base&, char, char, char,
173 		   unsigned long long) const;
174 #endif
175 
176 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
177   template
178     ostreambuf_iterator<wchar_t>
179     num_put<wchar_t, ostreambuf_iterator<wchar_t> >::
180     _M_convert_int(ostreambuf_iterator<wchar_t>, ios_base&, wchar_t, char,
181 		   char, long) const;
182 
183   template
184     ostreambuf_iterator<wchar_t>
185     num_put<wchar_t, ostreambuf_iterator<wchar_t> >::
186     _M_convert_int(ostreambuf_iterator<wchar_t>, ios_base&, wchar_t, char,
187 		   char, unsigned long) const;
188 
189 #ifdef _GLIBCPP_USE_LONG_LONG
190   template
191     ostreambuf_iterator<wchar_t>
192     num_put<wchar_t, ostreambuf_iterator<wchar_t> >::
193     _M_convert_int(ostreambuf_iterator<wchar_t>, ios_base&, wchar_t, char,
194 		   char, long long) const;
195 
196   template
197     ostreambuf_iterator<wchar_t>
198     num_put<wchar_t, ostreambuf_iterator<wchar_t> >::
199     _M_convert_int(ostreambuf_iterator<wchar_t>, ios_base&, wchar_t, char,
200 		   char, unsigned long long) const;
201 #endif
202 #endif
203 
204 #endif
205 
206   // time_get and time_put
207   template class __timepunct<char>;
208   template class time_put<char, ostreambuf_iterator<char> >;
209   template class time_put_byname<char, ostreambuf_iterator<char> >;
210   template class time_get<char, istreambuf_iterator<char> >;
211   template class time_get_byname<char, istreambuf_iterator<char> >;
212 
213 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
214   template class __timepunct<wchar_t>;
215   template class time_put<wchar_t, ostreambuf_iterator<wchar_t> >;
216   template class time_put_byname<wchar_t, ostreambuf_iterator<wchar_t> >;
217   template class time_get<wchar_t, istreambuf_iterator<wchar_t> >;
218   template class time_get_byname<wchar_t, istreambuf_iterator<wchar_t> >;
219 #endif
220 
221   // messages
222   template class messages<char>;
223   template class messages_byname<char>;
224 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
225   template class messages<wchar_t>;
226   template class messages_byname<wchar_t>;
227 #endif
228 
229   // ctype
230   inline template class __ctype_abstract_base<char>;
231   template class ctype_byname<char>;
232 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
233   inline template class __ctype_abstract_base<wchar_t>;
234   template class ctype_byname<wchar_t>;
235 #endif
236 
237   // codecvt
238   inline template class __codecvt_abstract_base<char, char, mbstate_t>;
239   template class codecvt_byname<char, char, mbstate_t>;
240 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
241   inline template class __codecvt_abstract_base<wchar_t, char, mbstate_t>;
242   template class codecvt_byname<wchar_t, char, mbstate_t>;
243 #endif
244 
245   // collate
246   template class collate<char>;
247   template class collate_byname<char>;
248 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
249   template class collate<wchar_t>;
250   template class collate_byname<wchar_t>;
251 #endif
252 
253   // use_facet
254   // NB: use_facet<ctype> is specialized
255   template
256     const codecvt<char, char, mbstate_t>&
257     use_facet<codecvt<char, char, mbstate_t> >(const locale&);
258 
259   template
260     const collate<char>&
261     use_facet<collate<char> >(const locale&);
262 
263   template
264     const numpunct<char>&
265     use_facet<numpunct<char> >(const locale&);
266 
267   template
268     const num_put<char>&
269     use_facet<num_put<char> >(const locale&);
270 
271   template
272     const num_get<char>&
273     use_facet<num_get<char> >(const locale&);
274 
275   template
276     const moneypunct<char, true>&
277     use_facet<moneypunct<char, true> >(const locale&);
278 
279   template
280     const moneypunct<char, false>&
281     use_facet<moneypunct<char, false> >(const locale&);
282 
283   template
284     const money_put<char>&
285     use_facet<money_put<char> >(const locale&);
286 
287   template
288     const money_get<char>&
289     use_facet<money_get<char> >(const locale&);
290 
291   template
292     const __timepunct<char>&
293     use_facet<__timepunct<char> >(const locale&);
294 
295   template
296     const time_put<char>&
297     use_facet<time_put<char> >(const locale&);
298 
299   template
300     const time_get<char>&
301     use_facet<time_get<char> >(const locale&);
302 
303   template
304     const messages<char>&
305     use_facet<messages<char> >(const locale&);
306 
307 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
308   template
309     const codecvt<wchar_t, char, mbstate_t>&
310     use_facet<codecvt<wchar_t, char, mbstate_t> >(locale const&);
311 
312   template
313     const collate<wchar_t>&
314     use_facet<collate<wchar_t> >(const locale&);
315 
316   template
317     const numpunct<wchar_t>&
318     use_facet<numpunct<wchar_t> >(const locale&);
319 
320   template
321     const num_put<wchar_t>&
322     use_facet<num_put<wchar_t> >(const locale&);
323 
324   template
325     const num_get<wchar_t>&
326     use_facet<num_get<wchar_t> >(const locale&);
327 
328   template
329     const moneypunct<wchar_t, true>&
330     use_facet<moneypunct<wchar_t, true> >(const locale&);
331 
332   template
333     const moneypunct<wchar_t, false>&
334     use_facet<moneypunct<wchar_t, false> >(const locale&);
335 
336   template
337     const money_put<wchar_t>&
338     use_facet<money_put<wchar_t> >(const locale&);
339 
340   template
341     const money_get<wchar_t>&
342     use_facet<money_get<wchar_t> >(const locale&);
343 
344   template
345     const __timepunct<wchar_t>&
346     use_facet<__timepunct<wchar_t> >(const locale&);
347 
348   template
349     const time_put<wchar_t>&
350     use_facet<time_put<wchar_t> >(const locale&);
351 
352   template
353     const time_get<wchar_t>&
354     use_facet<time_get<wchar_t> >(const locale&);
355 
356   template
357     const messages<wchar_t>&
358     use_facet<messages<wchar_t> >(const locale&);
359 #endif
360 
361   // has_facet
362   template
363     bool
364     has_facet<ctype<char> >(const locale&);
365 
366   template
367     bool
368     has_facet<codecvt<char, char, mbstate_t> >(const locale&);
369 
370   template
371     bool
372     has_facet<collate<char> >(const locale&);
373 
374   template
375     bool
376     has_facet<numpunct<char> >(const locale&);
377 
378   template
379     bool
380     has_facet<num_put<char> >(const locale&);
381 
382   template
383     bool
384     has_facet<num_get<char> >(const locale&);
385 
386   template
387     bool
388     has_facet<moneypunct<char> >(const locale&);
389 
390   template
391     bool
392     has_facet<money_put<char> >(const locale&);
393 
394   template
395     bool
396     has_facet<money_get<char> >(const locale&);
397 
398   template
399     bool
400     has_facet<__timepunct<char> >(const locale&);
401 
402   template
403     bool
404     has_facet<time_put<char> >(const locale&);
405 
406   template
407     bool
408     has_facet<time_get<char> >(const locale&);
409 
410   template
411     bool
412     has_facet<messages<char> >(const locale&);
413 
414 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
415  template
416     bool
417     has_facet<ctype<wchar_t> >(const locale&);
418 
419   template
420     bool
421     has_facet<codecvt<wchar_t, char, mbstate_t> >(const locale&);
422 
423   template
424     bool
425     has_facet<collate<wchar_t> >(const locale&);
426 
427   template
428     bool
429     has_facet<numpunct<wchar_t> >(const locale&);
430 
431   template
432     bool
433     has_facet<num_put<wchar_t> >(const locale&);
434 
435   template
436     bool
437     has_facet<num_get<wchar_t> >(const locale&);
438 
439   template
440     bool
441     has_facet<moneypunct<wchar_t> >(const locale&);
442 
443   template
444     bool
445     has_facet<money_put<wchar_t> >(const locale&);
446 
447   template
448     bool
449     has_facet<money_get<wchar_t> >(const locale&);
450 
451   template
452     bool
453     has_facet<__timepunct<wchar_t> >(const locale&);
454 
455   template
456     bool
457     has_facet<time_put<wchar_t> >(const locale&);
458 
459   template
460     bool
461     has_facet<time_get<wchar_t> >(const locale&);
462 
463   template
464     bool
465     has_facet<messages<wchar_t> >(const locale&);
466 #endif
467 
468   // __use_cache
469   template
470     const __locale_cache<numpunct<char> >&
471     __use_cache<numpunct<char> >(const locale& __loc);
472 
473 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
474    template
475     const __locale_cache<numpunct<wchar_t> >&
476     __use_cache<numpunct<wchar_t> >(const locale& __loc);
477 #endif
478 
479   // locale
480   template
481     char*
482     __add_grouping<char>(char*, char, char const*, char const*,
483 			 char const*, char const*);
484 
485   template
486     bool
487     __verify_grouping<char>(const basic_string<char>&, basic_string<char>&);
488 
489   template class __pad<char, char_traits<char> >;
490 
491 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
492   template
493     wchar_t*
494     __add_grouping<wchar_t>(wchar_t*, wchar_t, char const*, char const*,
495 			    wchar_t const*, wchar_t const*);
496   template
497     bool
498     __verify_grouping<wchar_t>(const basic_string<wchar_t>&,
499 			       basic_string<wchar_t>&);
500 
501   template class __pad<wchar_t, char_traits<wchar_t> >;
502 #endif
503 
504   template
505     int
506     __convert_from_v(char*, const int, const char*, double,
507 		     const __c_locale&, int);
508 
509   template
510     int
511     __convert_from_v(char*, const int, const char*, long double,
512 		     const __c_locale&, int);
513 
514   template
515     int
516     __convert_from_v(char*, const int, const char*, long,
517 		     const __c_locale&, int);
518 
519   template
520     int
521     __convert_from_v(char*, const int, const char*, unsigned long,
522 		     const __c_locale&, int);
523 
524 #ifdef _GLIBCPP_USE_LONG_LONG
525   template
526     int
527     __convert_from_v(char*, const int, const char*, long long,
528 		     const __c_locale&, int);
529 
530   template
531     int
532     __convert_from_v(char*, const int, const char*, unsigned long long,
533 		     const __c_locale&, int);
534 #endif
535 
536   template
537     int
538     __int_to_char(char*, const int, unsigned long, const char*,
539 		  ios_base::fmtflags, bool);
540 
541 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
542   template
543     int
544     __int_to_char(wchar_t*, const int, unsigned long, const wchar_t*,
545 		  ios_base::fmtflags, bool);
546 #endif
547 
548 #ifdef _GLIBCPP_USE_LONG_LONG
549   template
550     int
551     __int_to_char(char*, const int, unsigned long long, const char*,
552 		  ios_base::fmtflags, bool);
553 
554 #if defined(_GLIBCPP_USE_WCHAR_T) || defined(_GLIBCPP_USE_TYPE_WCHAR_T)
555   template
556     int
557     __int_to_char(wchar_t*, const int, unsigned long long, const wchar_t*,
558 		  ios_base::fmtflags, bool);
559 #endif
560 #endif
561 } // namespace std
562