1// std::numpunct implementation details, GNU version -*- C++ -*- 2 3// Copyright (C) 2001, 2002, 2003, 2004, 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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.2.3.1.2 numpunct virtual functions 32// 33 34// Written by Benjamin Kosnik <bkoz@redhat.com> 35 36#include <locale> 37#include <bits/c++locale_internal.h> 38 39_GLIBCXX_BEGIN_NAMESPACE(std) 40 41 template<> 42 void 43 numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) 44 { 45 if (!_M_data) 46 _M_data = new __numpunct_cache<char>; 47 48 if (!__cloc) 49 { 50 // "C" locale 51 _M_data->_M_grouping = ""; 52 _M_data->_M_grouping_size = 0; 53 _M_data->_M_use_grouping = false; 54 55 _M_data->_M_decimal_point = '.'; 56 _M_data->_M_thousands_sep = ','; 57 58 for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) 59 _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; 60 61 for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) 62 _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; 63 } 64 else 65 { 66 // Named locale. 67 _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, 68 __cloc)); 69 _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, 70 __cloc)); 71 72 // Check for NULL, which implies no grouping. 73 if (_M_data->_M_thousands_sep == '\0') 74 _M_data->_M_grouping = ""; 75 else 76 _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); 77 _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); 78 } 79 80 // NB: There is no way to extact this info from posix locales. 81 // _M_truename = __nl_langinfo_l(YESSTR, __cloc); 82 _M_data->_M_truename = "true"; 83 _M_data->_M_truename_size = 4; 84 // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); 85 _M_data->_M_falsename = "false"; 86 _M_data->_M_falsename_size = 5; 87 } 88 89 template<> 90 numpunct<char>::~numpunct() 91 { delete _M_data; } 92 93#ifdef _GLIBCXX_USE_WCHAR_T 94 template<> 95 void 96 numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) 97 { 98 if (!_M_data) 99 _M_data = new __numpunct_cache<wchar_t>; 100 101 if (!__cloc) 102 { 103 // "C" locale 104 _M_data->_M_grouping = ""; 105 _M_data->_M_grouping_size = 0; 106 _M_data->_M_use_grouping = false; 107 108 _M_data->_M_decimal_point = L'.'; 109 _M_data->_M_thousands_sep = L','; 110 111 // Use ctype::widen code without the facet... 112 for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) 113 _M_data->_M_atoms_out[__i] = 114 static_cast<wchar_t>(__num_base::_S_atoms_out[__i]); 115 116 for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) 117 _M_data->_M_atoms_in[__j] = 118 static_cast<wchar_t>(__num_base::_S_atoms_in[__j]); 119 } 120 else 121 { 122 // Named locale. 123 // NB: In the GNU model wchar_t is always 32 bit wide. 124 union { char *__s; wchar_t __w; } __u; 125 __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); 126 _M_data->_M_decimal_point = __u.__w; 127 128 __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); 129 _M_data->_M_thousands_sep = __u.__w; 130 131 if (_M_data->_M_thousands_sep == L'\0') 132 _M_data->_M_grouping = ""; 133 else 134 _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); 135 _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); 136 } 137 138 // NB: There is no way to extact this info from posix locales. 139 // _M_truename = __nl_langinfo_l(YESSTR, __cloc); 140 _M_data->_M_truename = L"true"; 141 _M_data->_M_truename_size = 4; 142 // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); 143 _M_data->_M_falsename = L"false"; 144 _M_data->_M_falsename_size = 5; 145 } 146 147 template<> 148 numpunct<wchar_t>::~numpunct() 149 { delete _M_data; } 150 #endif 151 152_GLIBCXX_END_NAMESPACE 153