xref: /dflybsd-src/contrib/gcc-8.0/libstdc++-v3/config/locale/dragonfly/monetary_members.cc (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
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