1*38fd1498Szrj // std::moneypunct implementation details, DragonFly version -*- C++ -*- 2*38fd1498Szrj 3*38fd1498Szrj // Copyright (C) 2015-2018 Free Software Foundation, Inc. 4*38fd1498Szrj // 5*38fd1498Szrj // This file is part of the GNU ISO C++ Library. This library is free 6*38fd1498Szrj // software; you can redistribute it and/or modify it under the 7*38fd1498Szrj // terms of the GNU General Public License as published by the 8*38fd1498Szrj // Free Software Foundation; either version 3, or (at your option) 9*38fd1498Szrj // any later version. 10*38fd1498Szrj 11*38fd1498Szrj // This library is distributed in the hope that it will be useful, 12*38fd1498Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*38fd1498Szrj // GNU General Public License for more details. 15*38fd1498Szrj 16*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional 17*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version 18*38fd1498Szrj // 3.1, as published by the Free Software Foundation. 19*38fd1498Szrj 20*38fd1498Szrj // You should have received a copy of the GNU General Public License and 21*38fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program; 22*38fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23*38fd1498Szrj // <http://www.gnu.org/licenses/>. 24*38fd1498Szrj 25*38fd1498Szrj // 26*38fd1498Szrj // ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions 27*38fd1498Szrj // 28*38fd1498Szrj 29*38fd1498Szrj // Written by Benjamin Kosnik <bkoz@redhat.com> 30*38fd1498Szrj // Modified for DragonFly by John Marino <gnugcc@marino.st> 31*38fd1498Szrj 32*38fd1498Szrj #include <locale> 33*38fd1498Szrj #include <cstring> 34*38fd1498Szrj #include <xlocale.h> 35*38fd1498Szrj 36*38fd1498Szrj namespace std _GLIBCXX_VISIBILITY(default) 37*38fd1498Szrj { 38*38fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION 39*38fd1498Szrj 40*38fd1498Szrj // This file might be compiled twice, but we only want to define the members 41*38fd1498Szrj // of money_base once. 42*38fd1498Szrj #if ! _GLIBCXX_USE_CXX11_ABI 43*38fd1498Szrj 44*38fd1498Szrj // Construct and return valid pattern consisting of some combination of: 45*38fd1498Szrj // space none symbol sign value 46*38fd1498Szrj money_base::pattern _S_construct_pattern(char __precedes,char __space,char __posn)47*38fd1498Szrj money_base::_S_construct_pattern(char __precedes, char __space, 48*38fd1498Szrj char __posn) throw() 49*38fd1498Szrj { 50*38fd1498Szrj pattern __ret; 51*38fd1498Szrj 52*38fd1498Szrj // This insanely complicated routine attempts to construct a valid 53*38fd1498Szrj // pattern for use with moneypunct. A couple of invariants: 54*38fd1498Szrj 55*38fd1498Szrj // if (__precedes) symbol -> value 56*38fd1498Szrj // else value -> symbol 57*38fd1498Szrj 58*38fd1498Szrj // if (__space) space 59*38fd1498Szrj // else none 60*38fd1498Szrj 61*38fd1498Szrj // none == never first 62*38fd1498Szrj // space never first or last 63*38fd1498Szrj 64*38fd1498Szrj // Any elegant implementations of this are welcome. 65*38fd1498Szrj switch (__posn) 66*38fd1498Szrj { 67*38fd1498Szrj case 0: 68*38fd1498Szrj case 1: 69*38fd1498Szrj // 1 The sign precedes the value and symbol. 70*38fd1498Szrj __ret.field[0] = sign; 71*38fd1498Szrj if (__space) 72*38fd1498Szrj { 73*38fd1498Szrj // Pattern starts with sign. 74*38fd1498Szrj if (__precedes) 75*38fd1498Szrj { 76*38fd1498Szrj __ret.field[1] = symbol; 77*38fd1498Szrj __ret.field[3] = value; 78*38fd1498Szrj } 79*38fd1498Szrj else 80*38fd1498Szrj { 81*38fd1498Szrj __ret.field[1] = value; 82*38fd1498Szrj __ret.field[3] = symbol; 83*38fd1498Szrj } 84*38fd1498Szrj __ret.field[2] = space; 85*38fd1498Szrj } 86*38fd1498Szrj else 87*38fd1498Szrj { 88*38fd1498Szrj // Pattern starts with sign and ends with none. 89*38fd1498Szrj if (__precedes) 90*38fd1498Szrj { 91*38fd1498Szrj __ret.field[1] = symbol; 92*38fd1498Szrj __ret.field[2] = value; 93*38fd1498Szrj } 94*38fd1498Szrj else 95*38fd1498Szrj { 96*38fd1498Szrj __ret.field[1] = value; 97*38fd1498Szrj __ret.field[2] = symbol; 98*38fd1498Szrj } 99*38fd1498Szrj __ret.field[3] = none; 100*38fd1498Szrj } 101*38fd1498Szrj break; 102*38fd1498Szrj case 2: 103*38fd1498Szrj // 2 The sign follows the value and symbol. 104*38fd1498Szrj if (__space) 105*38fd1498Szrj { 106*38fd1498Szrj // Pattern either ends with sign. 107*38fd1498Szrj if (__precedes) 108*38fd1498Szrj { 109*38fd1498Szrj __ret.field[0] = symbol; 110*38fd1498Szrj __ret.field[2] = value; 111*38fd1498Szrj } 112*38fd1498Szrj else 113*38fd1498Szrj { 114*38fd1498Szrj __ret.field[0] = value; 115*38fd1498Szrj __ret.field[2] = symbol; 116*38fd1498Szrj } 117*38fd1498Szrj __ret.field[1] = space; 118*38fd1498Szrj __ret.field[3] = sign; 119*38fd1498Szrj } 120*38fd1498Szrj else 121*38fd1498Szrj { 122*38fd1498Szrj // Pattern ends with sign then none. 123*38fd1498Szrj if (__precedes) 124*38fd1498Szrj { 125*38fd1498Szrj __ret.field[0] = symbol; 126*38fd1498Szrj __ret.field[1] = value; 127*38fd1498Szrj } 128*38fd1498Szrj else 129*38fd1498Szrj { 130*38fd1498Szrj __ret.field[0] = value; 131*38fd1498Szrj __ret.field[1] = symbol; 132*38fd1498Szrj } 133*38fd1498Szrj __ret.field[2] = sign; 134*38fd1498Szrj __ret.field[3] = none; 135*38fd1498Szrj } 136*38fd1498Szrj break; 137*38fd1498Szrj case 3: 138*38fd1498Szrj // 3 The sign immediately precedes the symbol. 139*38fd1498Szrj if (__precedes) 140*38fd1498Szrj { 141*38fd1498Szrj __ret.field[0] = sign; 142*38fd1498Szrj __ret.field[1] = symbol; 143*38fd1498Szrj if (__space) 144*38fd1498Szrj { 145*38fd1498Szrj __ret.field[2] = space; 146*38fd1498Szrj __ret.field[3] = value; 147*38fd1498Szrj } 148*38fd1498Szrj else 149*38fd1498Szrj { 150*38fd1498Szrj __ret.field[2] = value; 151*38fd1498Szrj __ret.field[3] = none; 152*38fd1498Szrj } 153*38fd1498Szrj } 154*38fd1498Szrj else 155*38fd1498Szrj { 156*38fd1498Szrj __ret.field[0] = value; 157*38fd1498Szrj if (__space) 158*38fd1498Szrj { 159*38fd1498Szrj __ret.field[1] = space; 160*38fd1498Szrj __ret.field[2] = sign; 161*38fd1498Szrj __ret.field[3] = symbol; 162*38fd1498Szrj } 163*38fd1498Szrj else 164*38fd1498Szrj { 165*38fd1498Szrj __ret.field[1] = sign; 166*38fd1498Szrj __ret.field[2] = symbol; 167*38fd1498Szrj __ret.field[3] = none; 168*38fd1498Szrj } 169*38fd1498Szrj } 170*38fd1498Szrj break; 171*38fd1498Szrj case 4: 172*38fd1498Szrj // 4 The sign immediately follows the symbol. 173*38fd1498Szrj if (__precedes) 174*38fd1498Szrj { 175*38fd1498Szrj __ret.field[0] = symbol; 176*38fd1498Szrj __ret.field[1] = sign; 177*38fd1498Szrj if (__space) 178*38fd1498Szrj { 179*38fd1498Szrj __ret.field[2] = space; 180*38fd1498Szrj __ret.field[3] = value; 181*38fd1498Szrj } 182*38fd1498Szrj else 183*38fd1498Szrj { 184*38fd1498Szrj __ret.field[2] = value; 185*38fd1498Szrj __ret.field[3] = none; 186*38fd1498Szrj } 187*38fd1498Szrj } 188*38fd1498Szrj else 189*38fd1498Szrj { 190*38fd1498Szrj __ret.field[0] = value; 191*38fd1498Szrj if (__space) 192*38fd1498Szrj { 193*38fd1498Szrj __ret.field[1] = space; 194*38fd1498Szrj __ret.field[2] = symbol; 195*38fd1498Szrj __ret.field[3] = sign; 196*38fd1498Szrj } 197*38fd1498Szrj else 198*38fd1498Szrj { 199*38fd1498Szrj __ret.field[1] = symbol; 200*38fd1498Szrj __ret.field[2] = sign; 201*38fd1498Szrj __ret.field[3] = none; 202*38fd1498Szrj } 203*38fd1498Szrj } 204*38fd1498Szrj break; 205*38fd1498Szrj default: 206*38fd1498Szrj __ret = pattern(); 207*38fd1498Szrj } 208*38fd1498Szrj return __ret; 209*38fd1498Szrj } 210*38fd1498Szrj #endif 211*38fd1498Szrj 212*38fd1498Szrj template<> 213*38fd1498Szrj void _M_initialize_moneypunct(__c_locale __cloc,const char *)214*38fd1498Szrj moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, 215*38fd1498Szrj const char*) 216*38fd1498Szrj { 217*38fd1498Szrj if (!_M_data) 218*38fd1498Szrj _M_data = new __moneypunct_cache<char, true>; 219*38fd1498Szrj 220*38fd1498Szrj if (!__cloc) 221*38fd1498Szrj { 222*38fd1498Szrj // "C" locale 223*38fd1498Szrj _M_data->_M_decimal_point = '.'; 224*38fd1498Szrj _M_data->_M_thousands_sep = ','; 225*38fd1498Szrj _M_data->_M_grouping = ""; 226*38fd1498Szrj _M_data->_M_grouping_size = 0; 227*38fd1498Szrj _M_data->_M_use_grouping = false; 228*38fd1498Szrj _M_data->_M_curr_symbol = ""; 229*38fd1498Szrj _M_data->_M_curr_symbol_size = 0; 230*38fd1498Szrj _M_data->_M_positive_sign = ""; 231*38fd1498Szrj _M_data->_M_positive_sign_size = 0; 232*38fd1498Szrj _M_data->_M_negative_sign = ""; 233*38fd1498Szrj _M_data->_M_negative_sign_size = 0; 234*38fd1498Szrj _M_data->_M_frac_digits = 0; 235*38fd1498Szrj _M_data->_M_pos_format = money_base::_S_default_pattern; 236*38fd1498Szrj _M_data->_M_neg_format = money_base::_S_default_pattern; 237*38fd1498Szrj 238*38fd1498Szrj for (size_t __i = 0; __i < money_base::_S_end; ++__i) 239*38fd1498Szrj _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; 240*38fd1498Szrj } 241*38fd1498Szrj else 242*38fd1498Szrj { 243*38fd1498Szrj // Named locale. 244*38fd1498Szrj lconv* lc = localeconv_l((locale_t) __cloc); 245*38fd1498Szrj 246*38fd1498Szrj // Check for NULL, which implies no fractional digits. 247*38fd1498Szrj if (lc->mon_decimal_point == NULL || 248*38fd1498Szrj lc->mon_decimal_point[0] == '\0') 249*38fd1498Szrj { 250*38fd1498Szrj // Like in "C" locale. 251*38fd1498Szrj _M_data->_M_frac_digits = 0; 252*38fd1498Szrj _M_data->_M_decimal_point = '.'; 253*38fd1498Szrj } 254*38fd1498Szrj else 255*38fd1498Szrj { 256*38fd1498Szrj _M_data->_M_decimal_point = lc->mon_decimal_point[0]; 257*38fd1498Szrj _M_data->_M_frac_digits = lc->int_frac_digits; 258*38fd1498Szrj } 259*38fd1498Szrj 260*38fd1498Szrj const char* __cgroup = lc->mon_grouping; 261*38fd1498Szrj const char* __cpossign = lc->positive_sign; 262*38fd1498Szrj const char* __cnegsign = lc->negative_sign; 263*38fd1498Szrj // _Intl == true 264*38fd1498Szrj const char* __ccurr = lc->int_curr_symbol; 265*38fd1498Szrj 266*38fd1498Szrj char* __group = 0; 267*38fd1498Szrj char* __ps = 0; 268*38fd1498Szrj char* __ns = 0; 269*38fd1498Szrj const char __nposn = lc->int_n_sign_posn; 270*38fd1498Szrj __try 271*38fd1498Szrj { 272*38fd1498Szrj size_t __len; 273*38fd1498Szrj 274*38fd1498Szrj // Check for NULL, which implies no grouping. 275*38fd1498Szrj if (lc->mon_thousands_sep == NULL || 276*38fd1498Szrj lc->mon_thousands_sep[0] == '\0') 277*38fd1498Szrj { 278*38fd1498Szrj // Like in "C" locale. 279*38fd1498Szrj _M_data->_M_grouping = ""; 280*38fd1498Szrj _M_data->_M_grouping_size = 0; 281*38fd1498Szrj _M_data->_M_use_grouping = false; 282*38fd1498Szrj _M_data->_M_thousands_sep = ','; 283*38fd1498Szrj } 284*38fd1498Szrj else 285*38fd1498Szrj { 286*38fd1498Szrj _M_data->_M_thousands_sep = lc->mon_thousands_sep[0]; 287*38fd1498Szrj 288*38fd1498Szrj __len = strlen(__cgroup); 289*38fd1498Szrj if (__len) 290*38fd1498Szrj { 291*38fd1498Szrj __group = new char[__len + 1]; 292*38fd1498Szrj memcpy(__group, __cgroup, __len + 1); 293*38fd1498Szrj _M_data->_M_grouping = __group; 294*38fd1498Szrj } 295*38fd1498Szrj else 296*38fd1498Szrj { 297*38fd1498Szrj _M_data->_M_grouping = ""; 298*38fd1498Szrj _M_data->_M_use_grouping = false; 299*38fd1498Szrj } 300*38fd1498Szrj _M_data->_M_grouping_size = __len; 301*38fd1498Szrj } 302*38fd1498Szrj 303*38fd1498Szrj __len = strlen(__cpossign); 304*38fd1498Szrj if (__len) 305*38fd1498Szrj { 306*38fd1498Szrj __ps = new char[__len + 1]; 307*38fd1498Szrj memcpy(__ps, __cpossign, __len + 1); 308*38fd1498Szrj _M_data->_M_positive_sign = __ps; 309*38fd1498Szrj } 310*38fd1498Szrj else 311*38fd1498Szrj _M_data->_M_positive_sign = ""; 312*38fd1498Szrj _M_data->_M_positive_sign_size = __len; 313*38fd1498Szrj 314*38fd1498Szrj if (!__nposn) 315*38fd1498Szrj { 316*38fd1498Szrj _M_data->_M_negative_sign = "()"; 317*38fd1498Szrj _M_data->_M_negative_sign_size = 2; 318*38fd1498Szrj } 319*38fd1498Szrj else 320*38fd1498Szrj { 321*38fd1498Szrj __len = strlen(__cnegsign); 322*38fd1498Szrj if (__len) 323*38fd1498Szrj { 324*38fd1498Szrj __ns = new char[__len + 1]; 325*38fd1498Szrj memcpy(__ns, __cnegsign, __len + 1); 326*38fd1498Szrj _M_data->_M_negative_sign = __ns; 327*38fd1498Szrj } 328*38fd1498Szrj else 329*38fd1498Szrj _M_data->_M_negative_sign = ""; 330*38fd1498Szrj _M_data->_M_negative_sign_size = __len; 331*38fd1498Szrj } 332*38fd1498Szrj 333*38fd1498Szrj __len = strlen(__ccurr); 334*38fd1498Szrj if (__len) 335*38fd1498Szrj { 336*38fd1498Szrj char* __curr = new char[__len + 1]; 337*38fd1498Szrj memcpy(__curr, __ccurr, __len + 1); 338*38fd1498Szrj _M_data->_M_curr_symbol = __curr; 339*38fd1498Szrj } 340*38fd1498Szrj else 341*38fd1498Szrj _M_data->_M_curr_symbol = ""; 342*38fd1498Szrj _M_data->_M_curr_symbol_size = __len; 343*38fd1498Szrj } 344*38fd1498Szrj __catch(...) 345*38fd1498Szrj { 346*38fd1498Szrj delete _M_data; 347*38fd1498Szrj _M_data = 0; 348*38fd1498Szrj delete [] __group; 349*38fd1498Szrj delete [] __ps; 350*38fd1498Szrj delete [] __ns; 351*38fd1498Szrj __throw_exception_again; 352*38fd1498Szrj } 353*38fd1498Szrj 354*38fd1498Szrj char __pprecedes = lc->int_p_cs_precedes; 355*38fd1498Szrj char __pspace = lc->int_p_sep_by_space; 356*38fd1498Szrj char __pposn = lc->int_p_sign_posn; 357*38fd1498Szrj _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 358*38fd1498Szrj __pposn); 359*38fd1498Szrj char __nprecedes = lc->int_n_cs_precedes; 360*38fd1498Szrj char __nspace = lc->int_n_sep_by_space; 361*38fd1498Szrj _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 362*38fd1498Szrj __nposn); 363*38fd1498Szrj } 364*38fd1498Szrj } 365*38fd1498Szrj 366*38fd1498Szrj template<> 367*38fd1498Szrj void _M_initialize_moneypunct(__c_locale __cloc,const char *)368*38fd1498Szrj moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, 369*38fd1498Szrj const char*) 370*38fd1498Szrj { 371*38fd1498Szrj if (!_M_data) 372*38fd1498Szrj _M_data = new __moneypunct_cache<char, false>; 373*38fd1498Szrj 374*38fd1498Szrj if (!__cloc) 375*38fd1498Szrj { 376*38fd1498Szrj // "C" locale 377*38fd1498Szrj _M_data->_M_decimal_point = '.'; 378*38fd1498Szrj _M_data->_M_thousands_sep = ','; 379*38fd1498Szrj _M_data->_M_grouping = ""; 380*38fd1498Szrj _M_data->_M_grouping_size = 0; 381*38fd1498Szrj _M_data->_M_use_grouping = false; 382*38fd1498Szrj _M_data->_M_curr_symbol = ""; 383*38fd1498Szrj _M_data->_M_curr_symbol_size = 0; 384*38fd1498Szrj _M_data->_M_positive_sign = ""; 385*38fd1498Szrj _M_data->_M_positive_sign_size = 0; 386*38fd1498Szrj _M_data->_M_negative_sign = ""; 387*38fd1498Szrj _M_data->_M_negative_sign_size = 0; 388*38fd1498Szrj _M_data->_M_frac_digits = 0; 389*38fd1498Szrj _M_data->_M_pos_format = money_base::_S_default_pattern; 390*38fd1498Szrj _M_data->_M_neg_format = money_base::_S_default_pattern; 391*38fd1498Szrj 392*38fd1498Szrj for (size_t __i = 0; __i < money_base::_S_end; ++__i) 393*38fd1498Szrj _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; 394*38fd1498Szrj } 395*38fd1498Szrj else 396*38fd1498Szrj { 397*38fd1498Szrj // Named locale. 398*38fd1498Szrj lconv* lc = localeconv_l((locale_t) __cloc); 399*38fd1498Szrj 400*38fd1498Szrj // Check for NULL, which implies no fractional digits. 401*38fd1498Szrj if (lc->mon_decimal_point == NULL || 402*38fd1498Szrj lc->mon_decimal_point[0] == '\0') 403*38fd1498Szrj { 404*38fd1498Szrj // Like in "C" locale. 405*38fd1498Szrj _M_data->_M_frac_digits = 0; 406*38fd1498Szrj _M_data->_M_decimal_point = '.'; 407*38fd1498Szrj } 408*38fd1498Szrj else 409*38fd1498Szrj { 410*38fd1498Szrj _M_data->_M_decimal_point = lc->mon_decimal_point[0]; 411*38fd1498Szrj _M_data->_M_frac_digits = lc->frac_digits; 412*38fd1498Szrj } 413*38fd1498Szrj 414*38fd1498Szrj const char* __cgroup = lc->mon_grouping; 415*38fd1498Szrj const char* __cpossign = lc->positive_sign; 416*38fd1498Szrj const char* __cnegsign = lc->negative_sign; 417*38fd1498Szrj // _Intl == false 418*38fd1498Szrj const char* __ccurr = lc->currency_symbol; 419*38fd1498Szrj 420*38fd1498Szrj char* __group = 0; 421*38fd1498Szrj char* __ps = 0; 422*38fd1498Szrj char* __ns = 0; 423*38fd1498Szrj const char __nposn = lc->n_sign_posn; 424*38fd1498Szrj __try 425*38fd1498Szrj { 426*38fd1498Szrj size_t __len; 427*38fd1498Szrj 428*38fd1498Szrj // Check for NULL, which implies no grouping. 429*38fd1498Szrj if (lc->mon_thousands_sep == NULL || 430*38fd1498Szrj lc->mon_thousands_sep[0] == '\0') 431*38fd1498Szrj { 432*38fd1498Szrj // Like in "C" locale. 433*38fd1498Szrj _M_data->_M_grouping = ""; 434*38fd1498Szrj _M_data->_M_grouping_size = 0; 435*38fd1498Szrj _M_data->_M_use_grouping = false; 436*38fd1498Szrj _M_data->_M_thousands_sep = ','; 437*38fd1498Szrj } 438*38fd1498Szrj else 439*38fd1498Szrj { 440*38fd1498Szrj _M_data->_M_thousands_sep = lc->mon_thousands_sep[0]; 441*38fd1498Szrj 442*38fd1498Szrj __len = strlen(__cgroup); 443*38fd1498Szrj if (__len) 444*38fd1498Szrj { 445*38fd1498Szrj __group = new char[__len + 1]; 446*38fd1498Szrj memcpy(__group, __cgroup, __len + 1); 447*38fd1498Szrj _M_data->_M_grouping = __group; 448*38fd1498Szrj } 449*38fd1498Szrj else 450*38fd1498Szrj { 451*38fd1498Szrj _M_data->_M_grouping = ""; 452*38fd1498Szrj _M_data->_M_use_grouping = false; 453*38fd1498Szrj } 454*38fd1498Szrj _M_data->_M_grouping_size = __len; 455*38fd1498Szrj } 456*38fd1498Szrj 457*38fd1498Szrj __len = strlen(__cpossign); 458*38fd1498Szrj if (__len) 459*38fd1498Szrj { 460*38fd1498Szrj __ps = new char[__len + 1]; 461*38fd1498Szrj memcpy(__ps, __cpossign, __len + 1); 462*38fd1498Szrj _M_data->_M_positive_sign = __ps; 463*38fd1498Szrj } 464*38fd1498Szrj else 465*38fd1498Szrj _M_data->_M_positive_sign = ""; 466*38fd1498Szrj _M_data->_M_positive_sign_size = __len; 467*38fd1498Szrj 468*38fd1498Szrj if (!__nposn) 469*38fd1498Szrj { 470*38fd1498Szrj _M_data->_M_negative_sign = "()"; 471*38fd1498Szrj _M_data->_M_negative_sign_size = 2; 472*38fd1498Szrj } 473*38fd1498Szrj else 474*38fd1498Szrj { 475*38fd1498Szrj __len = strlen(__cnegsign); 476*38fd1498Szrj if (__len) 477*38fd1498Szrj { 478*38fd1498Szrj __ns = new char[__len + 1]; 479*38fd1498Szrj memcpy(__ns, __cnegsign, __len + 1); 480*38fd1498Szrj _M_data->_M_negative_sign = __ns; 481*38fd1498Szrj } 482*38fd1498Szrj else 483*38fd1498Szrj _M_data->_M_negative_sign = ""; 484*38fd1498Szrj _M_data->_M_negative_sign_size = __len; 485*38fd1498Szrj } 486*38fd1498Szrj 487*38fd1498Szrj __len = strlen(__ccurr); 488*38fd1498Szrj if (__len) 489*38fd1498Szrj { 490*38fd1498Szrj char* __curr = new char[__len + 1]; 491*38fd1498Szrj memcpy(__curr, __ccurr, __len + 1); 492*38fd1498Szrj _M_data->_M_curr_symbol = __curr; 493*38fd1498Szrj } 494*38fd1498Szrj else 495*38fd1498Szrj _M_data->_M_curr_symbol = ""; 496*38fd1498Szrj _M_data->_M_curr_symbol_size = __len; 497*38fd1498Szrj } 498*38fd1498Szrj __catch(...) 499*38fd1498Szrj { 500*38fd1498Szrj delete _M_data; 501*38fd1498Szrj _M_data = 0; 502*38fd1498Szrj delete [] __group; 503*38fd1498Szrj delete [] __ps; 504*38fd1498Szrj delete [] __ns; 505*38fd1498Szrj __throw_exception_again; 506*38fd1498Szrj } 507*38fd1498Szrj 508*38fd1498Szrj char __pprecedes = lc->p_cs_precedes; 509*38fd1498Szrj char __pspace = lc->p_sep_by_space; 510*38fd1498Szrj char __pposn = lc->p_sign_posn; 511*38fd1498Szrj _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 512*38fd1498Szrj __pposn); 513*38fd1498Szrj char __nprecedes = lc->n_cs_precedes; 514*38fd1498Szrj char __nspace = lc->n_sep_by_space; 515*38fd1498Szrj _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 516*38fd1498Szrj __nposn); 517*38fd1498Szrj } 518*38fd1498Szrj } 519*38fd1498Szrj 520*38fd1498Szrj template<> ~moneypunct()521*38fd1498Szrj moneypunct<char, true>::~moneypunct() 522*38fd1498Szrj { 523*38fd1498Szrj if (_M_data->_M_grouping_size) 524*38fd1498Szrj delete [] _M_data->_M_grouping; 525*38fd1498Szrj if (_M_data->_M_positive_sign_size) 526*38fd1498Szrj delete [] _M_data->_M_positive_sign; 527*38fd1498Szrj if (_M_data->_M_negative_sign_size 528*38fd1498Szrj && strcmp(_M_data->_M_negative_sign, "()") != 0) 529*38fd1498Szrj delete [] _M_data->_M_negative_sign; 530*38fd1498Szrj if (_M_data->_M_curr_symbol_size) 531*38fd1498Szrj delete [] _M_data->_M_curr_symbol; 532*38fd1498Szrj delete _M_data; 533*38fd1498Szrj } 534*38fd1498Szrj 535*38fd1498Szrj template<> ~moneypunct()536*38fd1498Szrj moneypunct<char, false>::~moneypunct() 537*38fd1498Szrj { 538*38fd1498Szrj if (_M_data->_M_grouping_size) 539*38fd1498Szrj delete [] _M_data->_M_grouping; 540*38fd1498Szrj if (_M_data->_M_positive_sign_size) 541*38fd1498Szrj delete [] _M_data->_M_positive_sign; 542*38fd1498Szrj if (_M_data->_M_negative_sign_size 543*38fd1498Szrj && strcmp(_M_data->_M_negative_sign, "()") != 0) 544*38fd1498Szrj delete [] _M_data->_M_negative_sign; 545*38fd1498Szrj if (_M_data->_M_curr_symbol_size) 546*38fd1498Szrj delete [] _M_data->_M_curr_symbol; 547*38fd1498Szrj delete _M_data; 548*38fd1498Szrj } 549*38fd1498Szrj 550*38fd1498Szrj #ifdef _GLIBCXX_USE_WCHAR_T 551*38fd1498Szrj template<> 552*38fd1498Szrj void _M_initialize_moneypunct(__c_locale __cloc,const char *)553*38fd1498Szrj moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, 554*38fd1498Szrj const char*) 555*38fd1498Szrj { 556*38fd1498Szrj if (!_M_data) 557*38fd1498Szrj _M_data = new __moneypunct_cache<wchar_t, true>; 558*38fd1498Szrj 559*38fd1498Szrj if (!__cloc) 560*38fd1498Szrj { 561*38fd1498Szrj // "C" locale 562*38fd1498Szrj _M_data->_M_decimal_point = L'.'; 563*38fd1498Szrj _M_data->_M_thousands_sep = L','; 564*38fd1498Szrj _M_data->_M_grouping = ""; 565*38fd1498Szrj _M_data->_M_grouping_size = 0; 566*38fd1498Szrj _M_data->_M_use_grouping = false; 567*38fd1498Szrj _M_data->_M_curr_symbol = L""; 568*38fd1498Szrj _M_data->_M_curr_symbol_size = 0; 569*38fd1498Szrj _M_data->_M_positive_sign = L""; 570*38fd1498Szrj _M_data->_M_positive_sign_size = 0; 571*38fd1498Szrj _M_data->_M_negative_sign = L""; 572*38fd1498Szrj _M_data->_M_negative_sign_size = 0; 573*38fd1498Szrj _M_data->_M_frac_digits = 0; 574*38fd1498Szrj _M_data->_M_pos_format = money_base::_S_default_pattern; 575*38fd1498Szrj _M_data->_M_neg_format = money_base::_S_default_pattern; 576*38fd1498Szrj 577*38fd1498Szrj // Use ctype::widen code without the facet... 578*38fd1498Szrj for (size_t __i = 0; __i < money_base::_S_end; ++__i) 579*38fd1498Szrj _M_data->_M_atoms[__i] = 580*38fd1498Szrj static_cast<wchar_t>(money_base::_S_atoms[__i]); 581*38fd1498Szrj } 582*38fd1498Szrj else 583*38fd1498Szrj { 584*38fd1498Szrj __c_locale __old = (__c_locale)uselocale((locale_t)__cloc); 585*38fd1498Szrj // Named locale. 586*38fd1498Szrj lconv* lc = localeconv_l((locale_t) __cloc); 587*38fd1498Szrj 588*38fd1498Szrj // Check for NULL, which implies no fractional digits. 589*38fd1498Szrj if (lc->mon_decimal_point == NULL || 590*38fd1498Szrj lc->mon_decimal_point[0] == '\0') 591*38fd1498Szrj { 592*38fd1498Szrj // Like in "C" locale. 593*38fd1498Szrj _M_data->_M_frac_digits = 0; 594*38fd1498Szrj _M_data->_M_decimal_point = L'.'; 595*38fd1498Szrj } 596*38fd1498Szrj else 597*38fd1498Szrj { 598*38fd1498Szrj _M_data->_M_frac_digits = lc->int_frac_digits; 599*38fd1498Szrj _M_data->_M_decimal_point = (wchar_t)lc->mon_decimal_point[0]; 600*38fd1498Szrj } 601*38fd1498Szrj 602*38fd1498Szrj const char* __cgroup = lc->mon_grouping; 603*38fd1498Szrj const char* __cpossign = lc->positive_sign; 604*38fd1498Szrj const char* __cnegsign = lc->negative_sign; 605*38fd1498Szrj const char* __ccurr = lc->int_curr_symbol; 606*38fd1498Szrj 607*38fd1498Szrj char* __group = 0; 608*38fd1498Szrj wchar_t* __wcs_ps = 0; 609*38fd1498Szrj wchar_t* __wcs_ns = 0; 610*38fd1498Szrj const char __nposn = lc->int_n_sign_posn; 611*38fd1498Szrj __try 612*38fd1498Szrj { 613*38fd1498Szrj size_t __len; 614*38fd1498Szrj 615*38fd1498Szrj // Check for NULL, which implies no grouping. 616*38fd1498Szrj if (lc->mon_thousands_sep == NULL || 617*38fd1498Szrj lc->mon_thousands_sep[0] == '\0') 618*38fd1498Szrj { 619*38fd1498Szrj // Like in "C" locale. 620*38fd1498Szrj _M_data->_M_grouping = ""; 621*38fd1498Szrj _M_data->_M_grouping_size = 0; 622*38fd1498Szrj _M_data->_M_use_grouping = false; 623*38fd1498Szrj _M_data->_M_thousands_sep = L','; 624*38fd1498Szrj } 625*38fd1498Szrj else 626*38fd1498Szrj { 627*38fd1498Szrj _M_data->_M_thousands_sep = 628*38fd1498Szrj (wchar_t)lc->mon_thousands_sep[0]; 629*38fd1498Szrj __len = strlen(__cgroup); 630*38fd1498Szrj if (__len) 631*38fd1498Szrj { 632*38fd1498Szrj __group = new char[__len + 1]; 633*38fd1498Szrj memcpy(__group, __cgroup, __len + 1); 634*38fd1498Szrj _M_data->_M_grouping = __group; 635*38fd1498Szrj } 636*38fd1498Szrj else 637*38fd1498Szrj { 638*38fd1498Szrj _M_data->_M_grouping = ""; 639*38fd1498Szrj _M_data->_M_use_grouping = false; 640*38fd1498Szrj } 641*38fd1498Szrj _M_data->_M_grouping_size = __len; 642*38fd1498Szrj } 643*38fd1498Szrj 644*38fd1498Szrj mbstate_t __state; 645*38fd1498Szrj __len = strlen(__cpossign); 646*38fd1498Szrj if (__len) 647*38fd1498Szrj { 648*38fd1498Szrj memset(&__state, 0, sizeof(mbstate_t)); 649*38fd1498Szrj __wcs_ps = new wchar_t[__len + 1]; 650*38fd1498Szrj mbsrtowcs(__wcs_ps, &__cpossign, __len + 1, &__state); 651*38fd1498Szrj _M_data->_M_positive_sign = __wcs_ps; 652*38fd1498Szrj } 653*38fd1498Szrj else 654*38fd1498Szrj _M_data->_M_positive_sign = L""; 655*38fd1498Szrj _M_data->_M_positive_sign_size = 656*38fd1498Szrj wcslen(_M_data->_M_positive_sign); 657*38fd1498Szrj 658*38fd1498Szrj __len = strlen(__cnegsign); 659*38fd1498Szrj if (!__nposn) 660*38fd1498Szrj _M_data->_M_negative_sign = L"()"; 661*38fd1498Szrj else if (__len) 662*38fd1498Szrj { 663*38fd1498Szrj memset(&__state, 0, sizeof(mbstate_t)); 664*38fd1498Szrj __wcs_ns = new wchar_t[__len + 1]; 665*38fd1498Szrj mbsrtowcs(__wcs_ns, &__cnegsign, __len + 1, &__state); 666*38fd1498Szrj _M_data->_M_negative_sign = __wcs_ns; 667*38fd1498Szrj } 668*38fd1498Szrj else 669*38fd1498Szrj _M_data->_M_negative_sign = L""; 670*38fd1498Szrj _M_data->_M_negative_sign_size = 671*38fd1498Szrj wcslen(_M_data->_M_negative_sign); 672*38fd1498Szrj 673*38fd1498Szrj // _Intl == true. 674*38fd1498Szrj __len = strlen(__ccurr); 675*38fd1498Szrj if (__len) 676*38fd1498Szrj { 677*38fd1498Szrj memset(&__state, 0, sizeof(mbstate_t)); 678*38fd1498Szrj wchar_t* __wcs = new wchar_t[__len + 1]; 679*38fd1498Szrj mbsrtowcs(__wcs, &__ccurr, __len + 1, &__state); 680*38fd1498Szrj _M_data->_M_curr_symbol = __wcs; 681*38fd1498Szrj } 682*38fd1498Szrj else 683*38fd1498Szrj _M_data->_M_curr_symbol = L""; 684*38fd1498Szrj _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); 685*38fd1498Szrj } 686*38fd1498Szrj __catch(...) 687*38fd1498Szrj { 688*38fd1498Szrj delete _M_data; 689*38fd1498Szrj _M_data = 0; 690*38fd1498Szrj delete [] __group; 691*38fd1498Szrj delete [] __wcs_ps; 692*38fd1498Szrj delete [] __wcs_ns; 693*38fd1498Szrj uselocale((locale_t)__old); 694*38fd1498Szrj __throw_exception_again; 695*38fd1498Szrj } 696*38fd1498Szrj 697*38fd1498Szrj char __pprecedes = lc->int_p_cs_precedes; 698*38fd1498Szrj char __pspace = lc->int_p_sep_by_space; 699*38fd1498Szrj char __pposn = lc->int_p_sign_posn; 700*38fd1498Szrj _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 701*38fd1498Szrj __pposn); 702*38fd1498Szrj char __nprecedes = lc->int_n_cs_precedes; 703*38fd1498Szrj char __nspace = lc->int_n_sep_by_space; 704*38fd1498Szrj _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 705*38fd1498Szrj __nposn); 706*38fd1498Szrj 707*38fd1498Szrj uselocale((locale_t)__old); 708*38fd1498Szrj } 709*38fd1498Szrj } 710*38fd1498Szrj 711*38fd1498Szrj template<> 712*38fd1498Szrj void _M_initialize_moneypunct(__c_locale __cloc,const char *)713*38fd1498Szrj moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, 714*38fd1498Szrj const char*) 715*38fd1498Szrj { 716*38fd1498Szrj if (!_M_data) 717*38fd1498Szrj _M_data = new __moneypunct_cache<wchar_t, false>; 718*38fd1498Szrj 719*38fd1498Szrj if (!__cloc) 720*38fd1498Szrj { 721*38fd1498Szrj // "C" locale 722*38fd1498Szrj _M_data->_M_decimal_point = L'.'; 723*38fd1498Szrj _M_data->_M_thousands_sep = L','; 724*38fd1498Szrj _M_data->_M_grouping = ""; 725*38fd1498Szrj _M_data->_M_grouping_size = 0; 726*38fd1498Szrj _M_data->_M_use_grouping = false; 727*38fd1498Szrj _M_data->_M_curr_symbol = L""; 728*38fd1498Szrj _M_data->_M_curr_symbol_size = 0; 729*38fd1498Szrj _M_data->_M_positive_sign = L""; 730*38fd1498Szrj _M_data->_M_positive_sign_size = 0; 731*38fd1498Szrj _M_data->_M_negative_sign = L""; 732*38fd1498Szrj _M_data->_M_negative_sign_size = 0; 733*38fd1498Szrj _M_data->_M_frac_digits = 0; 734*38fd1498Szrj _M_data->_M_pos_format = money_base::_S_default_pattern; 735*38fd1498Szrj _M_data->_M_neg_format = money_base::_S_default_pattern; 736*38fd1498Szrj 737*38fd1498Szrj // Use ctype::widen code without the facet... 738*38fd1498Szrj for (size_t __i = 0; __i < money_base::_S_end; ++__i) 739*38fd1498Szrj _M_data->_M_atoms[__i] = 740*38fd1498Szrj static_cast<wchar_t>(money_base::_S_atoms[__i]); 741*38fd1498Szrj } 742*38fd1498Szrj else 743*38fd1498Szrj { 744*38fd1498Szrj __c_locale __old = (__c_locale)uselocale((locale_t)__cloc); 745*38fd1498Szrj // Named locale. 746*38fd1498Szrj lconv* lc = localeconv_l((locale_t) __cloc); 747*38fd1498Szrj 748*38fd1498Szrj // Check for NULL, which implies no fractional digits. 749*38fd1498Szrj if (lc->mon_decimal_point == NULL || 750*38fd1498Szrj lc->mon_decimal_point[0] == '\0') 751*38fd1498Szrj { 752*38fd1498Szrj // Like in "C" locale. 753*38fd1498Szrj _M_data->_M_frac_digits = 0; 754*38fd1498Szrj _M_data->_M_decimal_point = L'.'; 755*38fd1498Szrj } 756*38fd1498Szrj else 757*38fd1498Szrj { 758*38fd1498Szrj _M_data->_M_frac_digits = lc->frac_digits; 759*38fd1498Szrj _M_data->_M_decimal_point = (wchar_t)lc->mon_decimal_point[0]; 760*38fd1498Szrj } 761*38fd1498Szrj 762*38fd1498Szrj const char* __cgroup = lc->mon_grouping; 763*38fd1498Szrj const char* __cpossign = lc->positive_sign; 764*38fd1498Szrj const char* __cnegsign = lc->negative_sign; 765*38fd1498Szrj const char* __ccurr = lc->currency_symbol; 766*38fd1498Szrj 767*38fd1498Szrj char* __group = 0; 768*38fd1498Szrj wchar_t* __wcs_ps = 0; 769*38fd1498Szrj wchar_t* __wcs_ns = 0; 770*38fd1498Szrj const char __nposn = lc->n_sign_posn; 771*38fd1498Szrj __try 772*38fd1498Szrj { 773*38fd1498Szrj size_t __len; 774*38fd1498Szrj 775*38fd1498Szrj // Check for NULL, which implies no grouping. 776*38fd1498Szrj if (lc->mon_thousands_sep == NULL || 777*38fd1498Szrj lc->mon_thousands_sep[0] == '\0') 778*38fd1498Szrj { 779*38fd1498Szrj // Like in "C" locale. 780*38fd1498Szrj _M_data->_M_grouping = ""; 781*38fd1498Szrj _M_data->_M_grouping_size = 0; 782*38fd1498Szrj _M_data->_M_use_grouping = false; 783*38fd1498Szrj _M_data->_M_thousands_sep = L','; 784*38fd1498Szrj } 785*38fd1498Szrj else 786*38fd1498Szrj { 787*38fd1498Szrj _M_data->_M_thousands_sep = 788*38fd1498Szrj (wchar_t)lc->mon_thousands_sep[0]; 789*38fd1498Szrj __len = strlen(__cgroup); 790*38fd1498Szrj if (__len) 791*38fd1498Szrj { 792*38fd1498Szrj __group = new char[__len + 1]; 793*38fd1498Szrj memcpy(__group, __cgroup, __len + 1); 794*38fd1498Szrj _M_data->_M_grouping = __group; 795*38fd1498Szrj } 796*38fd1498Szrj else 797*38fd1498Szrj { 798*38fd1498Szrj _M_data->_M_grouping = ""; 799*38fd1498Szrj _M_data->_M_use_grouping = false; 800*38fd1498Szrj } 801*38fd1498Szrj _M_data->_M_grouping_size = __len; 802*38fd1498Szrj } 803*38fd1498Szrj 804*38fd1498Szrj mbstate_t __state; 805*38fd1498Szrj __len = strlen(__cpossign); 806*38fd1498Szrj if (__len) 807*38fd1498Szrj { 808*38fd1498Szrj memset(&__state, 0, sizeof(mbstate_t)); 809*38fd1498Szrj __wcs_ps = new wchar_t[__len + 1]; 810*38fd1498Szrj mbsrtowcs(__wcs_ps, &__cpossign, __len + 1, &__state); 811*38fd1498Szrj _M_data->_M_positive_sign = __wcs_ps; 812*38fd1498Szrj } 813*38fd1498Szrj else 814*38fd1498Szrj _M_data->_M_positive_sign = L""; 815*38fd1498Szrj _M_data->_M_positive_sign_size = 816*38fd1498Szrj wcslen(_M_data->_M_positive_sign); 817*38fd1498Szrj 818*38fd1498Szrj __len = strlen(__cnegsign); 819*38fd1498Szrj if (!__nposn) 820*38fd1498Szrj _M_data->_M_negative_sign = L"()"; 821*38fd1498Szrj else if (__len) 822*38fd1498Szrj { 823*38fd1498Szrj memset(&__state, 0, sizeof(mbstate_t)); 824*38fd1498Szrj __wcs_ns = new wchar_t[__len + 1]; 825*38fd1498Szrj mbsrtowcs(__wcs_ns, &__cnegsign, __len + 1, &__state); 826*38fd1498Szrj _M_data->_M_negative_sign = __wcs_ns; 827*38fd1498Szrj } 828*38fd1498Szrj else 829*38fd1498Szrj _M_data->_M_negative_sign = L""; 830*38fd1498Szrj _M_data->_M_negative_sign_size = 831*38fd1498Szrj wcslen(_M_data->_M_negative_sign); 832*38fd1498Szrj 833*38fd1498Szrj // _Intl == true. 834*38fd1498Szrj __len = strlen(__ccurr); 835*38fd1498Szrj if (__len) 836*38fd1498Szrj { 837*38fd1498Szrj memset(&__state, 0, sizeof(mbstate_t)); 838*38fd1498Szrj wchar_t* __wcs = new wchar_t[__len + 1]; 839*38fd1498Szrj mbsrtowcs(__wcs, &__ccurr, __len + 1, &__state); 840*38fd1498Szrj _M_data->_M_curr_symbol = __wcs; 841*38fd1498Szrj } 842*38fd1498Szrj else 843*38fd1498Szrj _M_data->_M_curr_symbol = L""; 844*38fd1498Szrj _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); 845*38fd1498Szrj } 846*38fd1498Szrj __catch(...) 847*38fd1498Szrj { 848*38fd1498Szrj delete _M_data; 849*38fd1498Szrj _M_data = 0; 850*38fd1498Szrj delete [] __group; 851*38fd1498Szrj delete [] __wcs_ps; 852*38fd1498Szrj delete [] __wcs_ns; 853*38fd1498Szrj uselocale((locale_t)__old); 854*38fd1498Szrj __throw_exception_again; 855*38fd1498Szrj } 856*38fd1498Szrj 857*38fd1498Szrj char __pprecedes = lc->p_cs_precedes; 858*38fd1498Szrj char __pspace = lc->p_sep_by_space; 859*38fd1498Szrj char __pposn = lc->p_sign_posn; 860*38fd1498Szrj _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 861*38fd1498Szrj __pposn); 862*38fd1498Szrj char __nprecedes = lc->n_cs_precedes; 863*38fd1498Szrj char __nspace = lc->n_sep_by_space; 864*38fd1498Szrj _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 865*38fd1498Szrj __nposn); 866*38fd1498Szrj 867*38fd1498Szrj uselocale((locale_t)__old); 868*38fd1498Szrj } 869*38fd1498Szrj } 870*38fd1498Szrj 871*38fd1498Szrj template<> ~moneypunct()872*38fd1498Szrj moneypunct<wchar_t, true>::~moneypunct() 873*38fd1498Szrj { 874*38fd1498Szrj if (_M_data->_M_grouping_size) 875*38fd1498Szrj delete [] _M_data->_M_grouping; 876*38fd1498Szrj if (_M_data->_M_positive_sign_size) 877*38fd1498Szrj delete [] _M_data->_M_positive_sign; 878*38fd1498Szrj if (_M_data->_M_negative_sign_size 879*38fd1498Szrj && wcscmp(_M_data->_M_negative_sign, L"()") != 0) 880*38fd1498Szrj delete [] _M_data->_M_negative_sign; 881*38fd1498Szrj if (_M_data->_M_curr_symbol_size) 882*38fd1498Szrj delete [] _M_data->_M_curr_symbol; 883*38fd1498Szrj delete _M_data; 884*38fd1498Szrj } 885*38fd1498Szrj 886*38fd1498Szrj template<> ~moneypunct()887*38fd1498Szrj moneypunct<wchar_t, false>::~moneypunct() 888*38fd1498Szrj { 889*38fd1498Szrj if (_M_data->_M_grouping_size) 890*38fd1498Szrj delete [] _M_data->_M_grouping; 891*38fd1498Szrj if (_M_data->_M_positive_sign_size) 892*38fd1498Szrj delete [] _M_data->_M_positive_sign; 893*38fd1498Szrj if (_M_data->_M_negative_sign_size 894*38fd1498Szrj && wcscmp(_M_data->_M_negative_sign, L"()") != 0) 895*38fd1498Szrj delete [] _M_data->_M_negative_sign; 896*38fd1498Szrj if (_M_data->_M_curr_symbol_size) 897*38fd1498Szrj delete [] _M_data->_M_curr_symbol; 898*38fd1498Szrj delete _M_data; 899*38fd1498Szrj } 900*38fd1498Szrj #endif 901*38fd1498Szrj 902*38fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION 903*38fd1498Szrj } // namespace 904