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