1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Silicon Graphics Computer Systems, Inc.
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Boris Fomitchev
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This material is provided "as is", with absolutely no warranty expressed
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or implied. Any use is at your own risk.
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use or copy this software for any purpose is hereby granted
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without fee, provided the above notices are retained on all copies.
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to modify the code and to distribute modified code is granted,
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided the above notices are retained, and a notice that the code was
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * modified is included with the above copyright notice.
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "stlport_prefix.h"
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <hash_map>
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <vector>
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <locale>
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <istream>
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <algorithm>
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <functional>
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "c_locale.h"
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "locale_impl.h"
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "acquire_release.h"
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_BEGIN_NAMESPACE
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//----------------------------------------------------------------------
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// ctype_byname<char>
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__DMC__)
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottctype_byname<char>::ctype_byname(const char* name, size_t refs)
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : ctype<char>( 0, false, refs) {
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!name)
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_null_name();
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int __err_code;
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf[_Locale_MAX_SIMPLE_NAME];
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _M_ctype = _STLP_PRIV __acquire_ctype(name, buf, 0, &__err_code);
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!_M_ctype)
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_creation_failure(__err_code, name, "ctype");
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _M_init();
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid ctype_byname<char>::_M_init() {
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _M_ctype_table = _M_byname_table;
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // We have to do this, instead of just pointer twiddling, because
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // ctype_base::mask isn't the same type as _Locale_mask_t.
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const _Locale_mask_t* p = _Locale_ctype_table(_M_ctype);
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (size_t i = 0; i != table_size; ++i) {
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_byname_table[i] = ctype_base::mask(p[i]);
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottctype_byname<char>::~ctype_byname()
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _STLP_PRIV __release_ctype(_M_ctype); }
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar ctype_byname<char>::do_toupper(char c) const
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return (char)_Locale_toupper(_M_ctype, c); }
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar ctype_byname<char>::do_tolower(char c) const
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return (char)_Locale_tolower(_M_ctype, c); }
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char*
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottctype_byname<char>::do_toupper(char* first, const char* last) const {
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for ( ; first != last ; ++first)
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    *first = (char)_Locale_toupper(_M_ctype, *first);
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return last;
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char*
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottctype_byname<char>::do_tolower(char* first, const char* last) const {
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for ( ; first != last ; ++first)
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    *first = (char)_Locale_tolower(_M_ctype, *first);
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return last;
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Some helper functions used in ctype<>::scan_is and scan_is_not.
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_WCHAR_T)
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_PRIV_NAMESPACE
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// ctype_byname<wchar_t>
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct _Ctype_byname_w_is_mask : public unary_function<wchar_t, bool> {
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_mask_t M;
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_ctype* M_ctp;
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Ctype_byname_w_is_mask(_Locale_mask_t m, _Locale_ctype* c)
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : M(m), M_ctp(c) {}
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  bool operator()(wchar_t c) const
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _WLocale_ctype(M_ctp, c, M) != 0; }
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_STD_NAMESPACE
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__DMC__)
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottctype_byname<wchar_t>::ctype_byname(const char* name, size_t refs)
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  : ctype<wchar_t>(refs) {
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!name)
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_null_name();
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int __err_code;
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf[_Locale_MAX_SIMPLE_NAME];
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _M_ctype = _STLP_PRIV __acquire_ctype(name, buf, 0, &__err_code);
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!_M_ctype)
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_creation_failure(__err_code, name, "ctype");
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottctype_byname<wchar_t>::~ctype_byname()
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _STLP_PRIV __release_ctype(_M_ctype); }
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool ctype_byname<wchar_t>::do_is(ctype_base::mask  m, wchar_t c) const
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _WLocale_ctype(_M_ctype, c, (_Locale_mask_t)m) != 0; }
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst wchar_t*
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottctype_byname<wchar_t>::do_is(const wchar_t* low, const wchar_t* high,
132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                             ctype_base::mask * m) const {
133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_mask_t all_bits = _Locale_mask_t(ctype_base::space |
134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                           ctype_base::print |
135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                           ctype_base::cntrl |
136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                           ctype_base::upper |
137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                           ctype_base::lower |
138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                           ctype_base::alpha |
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                           ctype_base::digit |
140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                           ctype_base::punct |
141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                           ctype_base::xdigit);
142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for ( ; low < high; ++low, ++m)
144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    *m = ctype_base::mask (_WLocale_ctype(_M_ctype, *low, all_bits));
145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return high;
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst wchar_t*
149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottctype_byname<wchar_t>
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ::do_scan_is(ctype_base::mask  m, const wchar_t* low, const wchar_t* high) const
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return find_if(low, high, _STLP_PRIV _Ctype_byname_w_is_mask(m, _M_ctype)); }
152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst wchar_t*
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottctype_byname<wchar_t>
155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ::do_scan_not(ctype_base::mask  m, const wchar_t* low, const wchar_t* high) const
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return find_if(low, high, not1(_STLP_PRIV _Ctype_byname_w_is_mask(m, _M_ctype))); }
157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwchar_t ctype_byname<wchar_t>::do_toupper(wchar_t c) const
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _WLocale_toupper(_M_ctype, c); }
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst wchar_t*
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottctype_byname<wchar_t>::do_toupper(wchar_t* low, const wchar_t* high) const {
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for ( ; low < high; ++low)
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    *low = _WLocale_toupper(_M_ctype, *low);
165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return high;
166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwchar_t ctype_byname<wchar_t>::do_tolower(wchar_t c) const
169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _WLocale_tolower(_M_ctype, c); }
170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst wchar_t*
172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottctype_byname<wchar_t>::do_tolower(wchar_t* low, const wchar_t* high) const {
173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for ( ; low < high; ++low)
174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    *low = _WLocale_tolower(_M_ctype, *low);
175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return high;
176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /* WCHAR_T */
179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// collate_byname<char>
181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__DMC__)
182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC
183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcollate_byname<char>::collate_byname(const char* name, size_t refs)
185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  : collate<char>(refs) {
186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!name)
187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_null_name();
188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int __err_code;
190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf[_Locale_MAX_SIMPLE_NAME];
191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _M_collate = _STLP_PRIV __acquire_collate(name, buf, 0, &__err_code);
192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!_M_collate)
193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_creation_failure(__err_code, name, "collate");
194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcollate_byname<char>::~collate_byname()
197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _STLP_PRIV __release_collate(_M_collate); }
198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint collate_byname<char>::do_compare(const char* __low1,
200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                     const char* __high1,
201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                     const char* __low2,
202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                     const char* __high2) const {
203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _Locale_strcmp(_M_collate,
204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                        __low1, __high1 - __low1,
205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                        __low2, __high2 - __low2);
206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcollate_byname<char>::string_type
209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcollate_byname<char>::do_transform(const char* low, const char* high) const {
210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (low == high)
211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return string_type();
212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t n = _Locale_strxfrm(_M_collate, NULL, 0, low, high - low);
214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // NOT PORTABLE.  What we're doing relies on internal details of the
216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // string implementation.  (Contiguity of string elements and presence
217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // of trailing zero.)
218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  string_type buf(n, 0);
219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Locale_strxfrm(_M_collate, &(*buf.begin()), n + 1, low, high - low);
220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return buf;
221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_WCHAR_T)
225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// collate_byname<wchar_t>
227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__DMC__)
229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC
230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcollate_byname<wchar_t>::collate_byname(const char* name, size_t refs)
232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  : collate<wchar_t>(refs) {
233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!name)
234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_null_name();
235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int __err_code;
237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf[_Locale_MAX_SIMPLE_NAME];
238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _M_collate = _STLP_PRIV __acquire_collate(name, buf, 0, &__err_code);
239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!_M_collate)
240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_creation_failure(__err_code, name, "collate");
241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcollate_byname<wchar_t>::~collate_byname()
244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _STLP_PRIV __release_collate(_M_collate); }
245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint collate_byname<wchar_t>::do_compare(const wchar_t* low1,
247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                        const wchar_t* high1,
248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                        const wchar_t* low2,
249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                        const wchar_t* high2) const {
250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _WLocale_strcmp(_M_collate,
251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                         low1, high1 - low1,
252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                         low2, high2 - low2);
253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcollate_byname<wchar_t>::string_type
256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcollate_byname<wchar_t>::do_transform(const wchar_t* low,
257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                      const wchar_t* high) const {
258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (low == high)
259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return string_type();
260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t n = _WLocale_strxfrm(_M_collate, NULL, 0, low, high - low);
262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // NOT PORTABLE.  What we're doing relies on internal details of the
264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // string implementation.  (Contiguity of string elements and presence
265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // of trailing zero.)
266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  string_type buf(n, 0);
267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _WLocale_strxfrm(_M_collate, &(*buf.begin()), n + 1, low, high - low);
268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return buf;
269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /*  _STLP_NO_WCHAR_T */
272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//----------------------------------------------------------------------
274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// codecvt_byname<char>
275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt_byname<char, char, mbstate_t>
277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ::codecvt_byname(const char* name, size_t refs)
278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : codecvt<char, char, mbstate_t>(refs) {
279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!name)
280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_null_name();
281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt_byname<char, char, mbstate_t>::~codecvt_byname() {}
284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_WCHAR_T)
287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//----------------------------------------------------------------------
289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// codecvt_byname<wchar_t>
290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt_byname<wchar_t, char, mbstate_t>::codecvt_byname(const char* name, size_t refs)
291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  : codecvt<wchar_t, char, mbstate_t>(refs) {
292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!name)
293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_null_name();
294e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
295e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int __err_code;
296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf[_Locale_MAX_SIMPLE_NAME];
297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _M_codecvt = _STLP_PRIV __acquire_codecvt(name, buf, 0, &__err_code);
298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!_M_codecvt)
299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_creation_failure(__err_code, name, "ctype");
300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt_byname<wchar_t, char, mbstate_t>::~codecvt_byname()
303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _STLP_PRIV __release_codecvt(_M_codecvt); }
304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt<wchar_t, char, mbstate_t>::result
306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt_byname<wchar_t, char, mbstate_t>::do_out(state_type&         state,
307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                 const intern_type*  from,
308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                 const intern_type*  from_end,
309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                 const intern_type*& from_next,
310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                 extern_type*        to,
311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                 extern_type*        to_limit,
312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                 extern_type*&       to_next) const {
313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (from != from_end && to != to_limit) {
314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_t chars_stored = _WLocale_wctomb(_M_codecvt,
315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                          to, to_limit - to, *from,
316e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                          &state);
317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (chars_stored == (size_t) -1) {
318e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      from_next = from;
319e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      to_next   = to;
320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      return error;
321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else if (chars_stored == (size_t) -2) {
323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      from_next = from;
324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      to_next   = to;
325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      return partial;
326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ++from;
329e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    to += chars_stored;
330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
331e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  from_next = from;
333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  to_next   = to;
334e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return ok;
335e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
337e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt<wchar_t, char, mbstate_t>::result
338e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt_byname<wchar_t, char, mbstate_t>::do_in(state_type&         state,
339e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                const extern_type*  from,
340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                const extern_type*  from_end,
341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                const extern_type*& from_next,
342e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                intern_type*        to,
343e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                intern_type*        to_end,
344e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                intern_type*&       to_next) const {
345e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (from != from_end && to != to_end) {
346e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_t chars_read = _WLocale_mbtowc(_M_codecvt,
347e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                        to, from, from_end - from,
348e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                        &state);
349e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (chars_read == (size_t) -1) {
350e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      from_next = from;
351e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      to_next   = to;
352e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      return error;
353e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
354e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
355e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (chars_read == (size_t) -2) {
356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      from_next = from;
357e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      to_next   = to;
358e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      return partial;
359e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
360e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
361e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    from += chars_read;
362e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    to++;
363e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
364e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
365e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  from_next = from;
366e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  to_next   = to;
367e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return ok;
368e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
369e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
370e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt<wchar_t, char, mbstate_t>::result
371e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt_byname<wchar_t, char, mbstate_t>::do_unshift(state_type&   state,
372e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                     extern_type*  to,
373e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                     extern_type*  to_limit,
374e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                     extern_type*& to_next) const {
375e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  to_next = to;
376e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t result = _WLocale_unshift(_M_codecvt, &state,
377e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                   to, to_limit - to, &to_next);
378e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (result == (size_t) -1)
379e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return error;
380e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else if (result == (size_t) -2)
381e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return partial;
382e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else
383e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    if defined (__ISCPP__)
384e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return /*to_next == to ? noconv :*/ ok;
385e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    else
386e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return to_next == to ? noconv : ok;
387e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    endif
388e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
389e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
390e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint
391e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt_byname<wchar_t, char, mbstate_t>::do_encoding() const _STLP_NOTHROW {
392e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (_WLocale_is_stateless(_M_codecvt)) {
393e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int max_width = _WLocale_mb_cur_max(_M_codecvt);
394e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int min_width = _WLocale_mb_cur_min(_M_codecvt);
395e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return min_width == max_width ? min_width : 0;
396e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
397e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else
398e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return -1;
399e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
400e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
401e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool
402e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt_byname<wchar_t, char, mbstate_t>::do_always_noconv() const _STLP_NOTHROW
403e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return false; }
404e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
405e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint
406e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt_byname<wchar_t, char, mbstate_t>::do_length(state_type&         state,
407e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                    const  extern_type* from,
408e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                    const  extern_type* end,
409e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                    size_t              mx) const {
410e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t __count = 0;
411e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (from != end && mx--) {
412e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    intern_type __dummy;
413e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_t chars_read = _WLocale_mbtowc(_M_codecvt,
414e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                        &__dummy, from, end - from,
415e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                        &state);
416e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if ((chars_read == (size_t) -1) || (chars_read == (size_t) -2)) // error or partial
417e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
418e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __count += chars_read;
419e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    from += chars_read;
420e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
421e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return int(__count);
422e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
423e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
424e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint
425e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcodecvt_byname<wchar_t, char, mbstate_t>::do_max_length() const _STLP_NOTHROW
426e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _WLocale_mb_cur_max(_M_codecvt); }
427e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
428e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
429e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// numpunct_byname<char>
430e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottnumpunct_byname<char>::numpunct_byname(const char* name, size_t refs)
431e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott: numpunct<char>(refs) {
432e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!name)
433e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_null_name();
434e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
435e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int __err_code;
436e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf[_Locale_MAX_SIMPLE_NAME];
437e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _M_numeric = _STLP_PRIV __acquire_numeric(name, buf, 0, &__err_code);
438e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!_M_numeric)
439e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_creation_failure(__err_code, name, "numpunct");
440e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
441e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
442e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottnumpunct_byname<char>::~numpunct_byname()
443e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _STLP_PRIV __release_numeric(_M_numeric); }
444e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
445e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar numpunct_byname<char>::do_decimal_point() const
446e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_decimal_point(_M_numeric); }
447e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
448e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar numpunct_byname<char>::do_thousands_sep() const
449e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_thousands_sep(_M_numeric); }
450e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
451e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring numpunct_byname<char>::do_grouping() const {
452e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const char * __grouping = _Locale_grouping(_M_numeric);
453e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__grouping != NULL && __grouping[0] == CHAR_MAX)
454e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __grouping = "";
455e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return __grouping;
456e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
457e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
458e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring numpunct_byname<char>::do_truename() const
459e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_true(_M_numeric); }
460e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
461e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring numpunct_byname<char>::do_falsename() const
462e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_false(_M_numeric); }
463e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
464e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//----------------------------------------------------------------------
465e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// numpunct<wchar_t>
466e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
467e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_WCHAR_T)
468e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
469e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// numpunct_byname<wchar_t>
470e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
471e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottnumpunct_byname<wchar_t>::numpunct_byname(const char* name, size_t refs)
472e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott: numpunct<wchar_t>(refs) {
473e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!name)
474e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_null_name();
475e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
476e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int __err_code;
477e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf[_Locale_MAX_SIMPLE_NAME];
478e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _M_numeric = _STLP_PRIV __acquire_numeric(name, buf, 0, &__err_code);
479e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!_M_numeric)
480e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_creation_failure(__err_code, name, "numpunct");
481e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
482e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
483e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottnumpunct_byname<wchar_t>::~numpunct_byname()
484e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _STLP_PRIV __release_numeric(_M_numeric); }
485e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
486e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwchar_t numpunct_byname<wchar_t>::do_decimal_point() const
487e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _WLocale_decimal_point(_M_numeric); }
488e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
489e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwchar_t numpunct_byname<wchar_t>::do_thousands_sep() const
490e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _WLocale_thousands_sep(_M_numeric); }
491e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
492e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring numpunct_byname<wchar_t>::do_grouping() const {
493e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const char * __grouping = _Locale_grouping(_M_numeric);
494e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (__grouping != NULL && __grouping[0] == CHAR_MAX)
495e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __grouping = "";
496e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return __grouping;
497e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
498e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
499e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwstring numpunct_byname<wchar_t>::do_truename() const {
500e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wchar_t buf[16];
501e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _WLocale_true(_M_numeric, _STLP_ARRAY_AND_SIZE(buf));
502e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
503e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
504e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwstring numpunct_byname<wchar_t>::do_falsename() const {
505e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wchar_t buf[16];
506e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _WLocale_false(_M_numeric, _STLP_ARRAY_AND_SIZE(buf));
507e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
508e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
509e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
510e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
511e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_PRIV_NAMESPACE
512e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
513e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void _Init_monetary_formats(money_base::pattern& pos_format,
514e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                   money_base::pattern& neg_format,
515e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                   _Locale_monetary * monetary) {
516e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  switch (_Locale_p_sign_posn(monetary)) {
517e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 0: // Parentheses surround the quantity and currency symbol
518e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 1: // The sign string precedes the quantity and currency symbol
519e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[0] = (char) money_base::sign;
520e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (_Locale_p_cs_precedes(monetary)) {
521e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 1 if currency symbol precedes a positive value
522e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[1] = (char) money_base::symbol;
523e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (_Locale_p_sep_by_space(monetary)) {
524e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space separates currency symbol from a positive value.
525e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[2] = (char) money_base::space;
526e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[3] = (char) money_base::value;
527e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        } else {
528e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space not separates currency symbol from a positive value.
529e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[2] = (char) money_base::value;
530e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[3] = (char) money_base::none;
531e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
532e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      } else {
533e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 0 if currency symbol succeeds a positive value
534e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[1] = (char) money_base::value;
535e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (_Locale_p_sep_by_space(monetary)) {
536e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space separates currency symbol from a positive value.
537e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[2] = (char) money_base::space;
538e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[3] = (char) money_base::symbol;
539e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        } else {
540e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space not separates currency symbol from a positive value.
541e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[2] = (char) money_base::symbol;
542e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[3] = (char) money_base::none;
543e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
544e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
545e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
546e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 2: // The sign string succeeds the quantity and currency symbol.
547e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (_Locale_p_cs_precedes(monetary)) {
548e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 1 if currency symbol precedes a positive value
549e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[0] = (char) money_base::symbol;
550e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (_Locale_p_sep_by_space(monetary)) {
551e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space separates currency symbol from a positive value.
552e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[1] = (char) money_base::space;
553e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[2] = (char) money_base::value;
554e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[3] = (char) money_base::sign;
555e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        } else {
556e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space not separates currency symbol from a positive value.
557e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[1] = (char) money_base::value;
558e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[2] = (char) money_base::sign;
559e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[3] = (char) money_base::none;
560e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
561e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      } else {
562e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 0 if currency symbol succeeds a positive value
563e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[0] = (char) money_base::value;
564e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (_Locale_p_sep_by_space(monetary)) {
565e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space separates currency symbol from a positive value.
566e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[1] = (char) money_base::space;
567e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[2] = (char) money_base::symbol;
568e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[3] = (char) money_base::sign;
569e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        } else {
570e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space not separates currency symbol from a positive value.
571e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[1] = (char) money_base::symbol;
572e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[2] = (char) money_base::sign;
573e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[3] = (char) money_base::none;
574e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
575e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
576e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
577e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 3: // The sign string immediately precedes the currency symbol.
578e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (_Locale_p_cs_precedes(monetary)) {
579e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 1 if currency symbol precedes a positive value
580e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[0] = (char) money_base::sign;
581e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[1] = (char) money_base::symbol;
582e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (_Locale_p_sep_by_space(monetary)) {
583e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space separates currency symbol from a positive value.
584e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[2] = (char) money_base::space;
585e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[3] = (char) money_base::value;
586e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        } else {
587e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space not separates currency symbol from a positive value.
588e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[2] = (char) money_base::value;
589e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[3] = (char) money_base::none;
590e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
591e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      } else {
592e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 0 if currency symbol succeeds a positive value
593e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[0] = (char) money_base::value;
594e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[1] = (char) money_base::sign;
595e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[2] = (char) money_base::symbol;
596e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[3] = (char) money_base::none;
597e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
598e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
599e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 4: // The sign string immediately succeeds the currency symbol.
600e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (_Locale_p_cs_precedes(monetary)) {
601e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 1 if currency symbol precedes a positive value
602e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[0] = (char) money_base::symbol;
603e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[1] = (char) money_base::sign;
604e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[2] = (char) money_base::value;
605e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[3] = (char) money_base::none;
606e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      } else {
607e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 0 if currency symbol succeeds a positive value
608e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[0] = (char) money_base::value;
609e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (_Locale_p_sep_by_space(monetary)) {
610e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space separates currency symbol from a positive value.
611e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[1] = (char) money_base::space;
612e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[2] = (char) money_base::symbol;
613e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[3] = (char) money_base::sign;
614e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        } else {
615e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space not separates currency symbol from a positive value.
616e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[1] = (char) money_base::symbol;
617e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[2] = (char) money_base::sign;
618e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          pos_format.field[3] = (char) money_base::none;
619e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
620e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
621e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
622e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    default: // Default C++ Standard format
623e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[0] = (char) money_base::symbol;
624e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[1] = (char) money_base::sign;
625e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[2] = (char) money_base::none;
626e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[3] = (char) money_base::value;
627e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
628e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
629e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
630e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  switch (_Locale_n_sign_posn(monetary)) {
631e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 0: // Parentheses surround the quantity and currency symbol
632e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 1: // The sign string precedes the quantity and currency symbol
633e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[0] = (char) money_base::sign;
634e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (_Locale_n_cs_precedes(monetary)) {
635e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 1 if currency symbol precedes a negative value
636e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[1] = (char) money_base::symbol;
637e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (_Locale_n_sep_by_space(monetary)) {
638e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space separates currency symbol from a negative value.
639e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[2] = (char) money_base::space;
640e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[3] = (char) money_base::value;
641e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        } else {
642e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space not separates currency symbol from a negative value.
643e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[2] = (char) money_base::value;
644e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[3] = (char) money_base::none;
645e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
646e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      } else {
647e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 0 if currency symbol succeeds a negative value
648e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[1] = (char) money_base::value;
649e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (_Locale_n_sep_by_space(monetary)) {
650e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space separates currency symbol from a negative value.
651e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[2] = (char) money_base::space;
652e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[3] = (char) money_base::symbol;
653e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        } else {
654e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space not separates currency symbol from a negative value.
655e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[2] = (char) money_base::symbol;
656e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[3] = (char) money_base::none;
657e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
658e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
659e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
660e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 2: // The sign string succeeds the quantity and currency symbol.
661e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (_Locale_n_cs_precedes(monetary)) {
662e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 1 if currency symbol precedes a negative value
663e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[0] = (char) money_base::symbol;
664e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (_Locale_n_sep_by_space(monetary)) {
665e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space separates currency symbol from a negative value.
666e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[1] = (char) money_base::space;
667e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[2] = (char) money_base::value;
668e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[3] = (char) money_base::sign;
669e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        } else {
670e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space not separates currency symbol from a negative value.
671e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[1] = (char) money_base::value;
672e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[2] = (char) money_base::sign;
673e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[3] = (char) money_base::none;
674e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
675e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      } else {
676e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 0 if currency symbol succeeds a negative value
677e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[0] = (char) money_base::value;
678e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (_Locale_n_sep_by_space(monetary)) {
679e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space separates currency symbol from a negative value.
680e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[1] = (char) money_base::space;
681e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[2] = (char) money_base::symbol;
682e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[3] = (char) money_base::sign;
683e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        } else {
684e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space not separates currency symbol from a negative value.
685e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[1] = (char) money_base::symbol;
686e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[2] = (char) money_base::sign;
687e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[3] = (char) money_base::none;
688e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
689e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
690e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
691e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 3: // The sign string immediately precedes the currency symbol.
692e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (_Locale_n_cs_precedes(monetary)) {
693e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 1 if currency symbol precedes a negative value
694e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[0] = (char) money_base::sign;
695e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[1] = (char) money_base::symbol;
696e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (_Locale_n_sep_by_space(monetary)) {
697e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space separates currency symbol from a negative value.
698e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[2] = (char) money_base::space;
699e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[3] = (char) money_base::value;
700e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        } else {
701e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space not separates currency symbol from a negative value.
702e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[2] = (char) money_base::value;
703e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[3] = (char) money_base::none;
704e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
705e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      } else {
706e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 0 if currency symbol succeeds a negative value
707e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[0] = (char) money_base::value;
708e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[1] = (char) money_base::sign;
709e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[2] = (char) money_base::symbol;
710e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[3] = (char) money_base::none;
711e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
712e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
713e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 4: // The sign string immediately succeeds the currency symbol.
714e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (_Locale_n_cs_precedes(monetary)) {
715e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 1 if currency symbol precedes a negative value
716e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[0] = (char) money_base::symbol;
717e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[1] = (char) money_base::sign;
718e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[2] = (char) money_base::none;
719e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[3] = (char) money_base::value;
720e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      } else {
721e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 0 if currency symbol succeeds a negative value
722e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[0] = (char) money_base::value;
723e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        if (_Locale_n_sep_by_space(monetary)) {
724e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space separates currency symbol from a negative value.
725e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[1] = (char) money_base::space;
726e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[2] = (char) money_base::symbol;
727e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[3] = (char) money_base::sign;
728e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        } else {
729e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          // a space not separates currency symbol from a negative value.
730e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[1] = (char) money_base::symbol;
731e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[2] = (char) money_base::sign;
732e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          neg_format.field[3] = (char) money_base::none;
733e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        }
734e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
735e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
736e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    default: // Default C++ Standard format
737e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[0] = (char) money_base::symbol;
738e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[1] = (char) money_base::sign;
739e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[2] = (char) money_base::none;
740e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[3] = (char) money_base::value;
741e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
742e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
743e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
744e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
745e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// international variant of monetary
746e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
747e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*
748e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * int_curr_symbol
749e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
750e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *   The international currency symbol. The operand is a four-character
751e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *   string, with the first three characters containing the alphabetic
752e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *   international currency symbol in accordance with those specified
753e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *   in the ISO 4217 specification. The fourth character is the character used
754e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *   to separate the international currency symbol from the monetary quantity.
755e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
756e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * (http://www.opengroup.org/onlinepubs/7990989775/xbd/locale.html)
757e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */
758e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
759e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*
760e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Standards are unclear in the usage of international currency
761e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * and monetary formats.
762e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * But I am expect that international currency symbol should be the first
763e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * (not depends upon where currency symbol situated in the national
764e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * format).
765e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
766e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * If this isn't so, let's see:
767e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *       1 234.56 RUR
768e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *       GBP 1,234.56
769e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *       USD 1,234.56
770e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * The situation really is worse than you see above:
771e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * RUR typed wrong here---it prints '1 234.56 RUR ' (see space after RUR).
772e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This is due to intl_fmp.curr_symbol() == "RUR ". (see reference in comments
773e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * above).
774e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
775e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */
776e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
777e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void _Init_monetary_formats_int(money_base::pattern& pos_format,
778e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       money_base::pattern& neg_format,
779e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       _Locale_monetary * monetary)
780e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
781e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
782e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  switch (_Locale_p_sign_posn(monetary)) {
783e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 0: // Parentheses surround the quantity and currency symbol
784e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 1: // The sign string precedes the quantity and currency symbol
785e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[0] = (char) money_base::symbol;
786e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[1] = (char) money_base::sign;
787e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[2] = (char) money_base::value;
788e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[3] = (char) money_base::none;
789e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
790e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 2: // The sign string succeeds the quantity and currency symbol.
791e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[0] = (char) money_base::symbol;
792e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[1] = (char) money_base::value;
793e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[2] = (char) money_base::sign;
794e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[3] = (char) money_base::none;
795e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
796e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 3: // The sign string immediately precedes the currency symbol.
797e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 4: // The sign string immediately succeeds the currency symbol.
798e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[0] = (char) money_base::symbol;
799e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (_Locale_p_cs_precedes(monetary)) {
800e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 1 if currency symbol precedes a positive value
801e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[1] = (char) money_base::sign;
802e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[2] = (char) money_base::value;
803e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      } else {
804e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 0 if currency symbol succeeds a positive value
805e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[1] = (char) money_base::value;
806e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        pos_format.field[2] = (char) money_base::sign;
807e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
808e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[3] = (char) money_base::none;
809e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
810e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    default: // Default C++ Standard format
811e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[0] = (char) money_base::symbol;
812e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[1] = (char) money_base::sign;
813e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[2] = (char) money_base::none;
814e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      pos_format.field[3] = (char) money_base::value;
815e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
816e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
817e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
818e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
819e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  switch (_Locale_n_sign_posn(monetary)) {
820e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 0: // Parentheses surround the quantity and currency symbol
821e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 1: // The sign string precedes the quantity and currency symbol
822e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[0] = (char) money_base::symbol;
823e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[1] = (char) money_base::sign;
824e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[2] = (char) money_base::value;
825e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[3] = (char) money_base::none;
826e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
827e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 2: // The sign string succeeds the quantity and currency symbol.
828e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[0] = (char) money_base::symbol;
829e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[1] = (char) money_base::value;
830e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[2] = (char) money_base::sign;
831e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[3] = (char) money_base::none;
832e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
833e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 3: // The sign string immediately precedes the currency symbol.
834e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case 4: // The sign string immediately succeeds the currency symbol.
835e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[0] = (char) money_base::symbol;
836e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (_Locale_n_cs_precedes(monetary)) {
837e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 1 if currency symbol precedes a negative value
838e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[1] = (char) money_base::sign;
839e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[2] = (char) money_base::value;
840e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      } else {
841e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        // 0 if currency symbol succeeds a negative value
842e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[1] = (char) money_base::value;
843e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        neg_format.field[2] = (char) money_base::sign;
844e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
845e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[3] = (char) money_base::none;
846e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
847e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    default: // Default C++ Standard format
848e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[0] = (char) money_base::symbol;
849e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[1] = (char) money_base::sign;
850e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[2] = (char) money_base::none;
851e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      neg_format.field[3] = (char) money_base::value;
852e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      break;
853e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
854e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
855e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
856e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_STD_NAMESPACE
857e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
858e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
859e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// moneypunct_byname<>
860e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
861e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottmoneypunct_byname<char, true>::moneypunct_byname(const char * name,
862e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                 size_t refs)
863e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : moneypunct<char, true>(refs) {
864e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!name)
865e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_null_name();
866e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
867e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int __err_code;
868e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf[_Locale_MAX_SIMPLE_NAME];
869e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _M_monetary = _STLP_PRIV __acquire_monetary(name, buf, 0, &__err_code);
870e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!_M_monetary)
871e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_creation_failure(__err_code, name, "moneypunct");
872e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
873e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV _Init_monetary_formats_int(_M_pos_format, _M_neg_format, _M_monetary);
874e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
875e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
876e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottmoneypunct_byname<char, true>::moneypunct_byname(_Locale_monetary *__mon)
877e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  : _M_monetary(__mon) {
878e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV _Init_monetary_formats_int(_M_pos_format, _M_neg_format, _M_monetary);
879e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
880e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
881e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottmoneypunct_byname<char, true>::~moneypunct_byname()
882e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _STLP_PRIV __release_monetary(_M_monetary); }
883e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
884e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar moneypunct_byname<char, true>::do_decimal_point() const
885e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_mon_decimal_point(_M_monetary); }
886e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
887e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar moneypunct_byname<char, true>::do_thousands_sep() const
888e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_mon_thousands_sep(_M_monetary); }
889e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
890e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring moneypunct_byname<char, true>::do_grouping() const
891e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_mon_grouping(_M_monetary); }
892e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
893e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring moneypunct_byname<char, true>::do_curr_symbol() const
894e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_int_curr_symbol(_M_monetary); }
895e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
896e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring moneypunct_byname<char, true>::do_positive_sign() const
897e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_positive_sign(_M_monetary); }
898e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
899e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring moneypunct_byname<char, true>::do_negative_sign() const
900e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_negative_sign(_M_monetary); }
901e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
902e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint moneypunct_byname<char, true>::do_frac_digits() const
903e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_int_frac_digits(_M_monetary); }
904e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
905e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottmoneypunct_byname<char, false>::moneypunct_byname(const char * name,
906e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                  size_t refs)
907e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : moneypunct<char, false>(refs) {
908e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!name)
909e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_null_name();
910e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
911e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int __err_code;
912e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf[_Locale_MAX_SIMPLE_NAME];
913e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _M_monetary = _STLP_PRIV __acquire_monetary(name, buf, 0, &__err_code);
914e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!_M_monetary)
915e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_creation_failure(__err_code, name, "moneypunct");
916e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
917e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV _Init_monetary_formats(_M_pos_format, _M_neg_format, _M_monetary);
918e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
919e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
920e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottmoneypunct_byname<char, false>::moneypunct_byname(_Locale_monetary *__mon)
921e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  : _M_monetary(__mon) {
922e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV _Init_monetary_formats(_M_pos_format, _M_neg_format, _M_monetary);
923e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
924e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
925e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottmoneypunct_byname<char, false>::~moneypunct_byname()
926e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _STLP_PRIV __release_monetary(_M_monetary); }
927e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
928e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar moneypunct_byname<char, false>::do_decimal_point() const
929e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_mon_decimal_point(_M_monetary); }
930e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
931e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar moneypunct_byname<char, false>::do_thousands_sep() const
932e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_mon_thousands_sep(_M_monetary); }
933e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
934e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring moneypunct_byname<char, false>::do_grouping() const
935e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_mon_grouping(_M_monetary); }
936e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
937e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring moneypunct_byname<char, false>::do_curr_symbol() const
938e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_currency_symbol(_M_monetary); }
939e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
940e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring moneypunct_byname<char, false>::do_positive_sign() const
941e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_positive_sign(_M_monetary); }
942e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
943e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring moneypunct_byname<char, false>::do_negative_sign() const
944e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_negative_sign(_M_monetary); }
945e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
946e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint moneypunct_byname<char, false>::do_frac_digits() const
947e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_frac_digits(_M_monetary); }
948e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
949e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
950e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// moneypunct_byname<wchar_t>
951e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
952e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_WCHAR_T)
953e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
954e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottmoneypunct_byname<wchar_t, true>::moneypunct_byname(const char * name,
955e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                    size_t refs)
956e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : moneypunct<wchar_t, true>(refs) {
957e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!name)
958e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_null_name();
959e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
960e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int __err_code;
961e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf[_Locale_MAX_SIMPLE_NAME];
962e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _M_monetary = _STLP_PRIV __acquire_monetary(name, buf, 0, &__err_code);
963e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!_M_monetary)
964e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_creation_failure(__err_code, name, "moneypunct");
965e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
966e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV _Init_monetary_formats_int(_M_pos_format, _M_neg_format, _M_monetary);
967e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
968e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
969e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottmoneypunct_byname<wchar_t, true>::moneypunct_byname(_Locale_monetary *__mon)
970e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  : _M_monetary(__mon) {
971e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV _Init_monetary_formats_int(_M_pos_format, _M_neg_format, _M_monetary);
972e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
973e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
974e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottmoneypunct_byname<wchar_t, true>::~moneypunct_byname()
975e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _STLP_PRIV __release_monetary(_M_monetary); }
976e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
977e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwchar_t moneypunct_byname<wchar_t, true>::do_decimal_point() const
978e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_mon_decimal_point(_M_monetary); }
979e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
980e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwchar_t moneypunct_byname<wchar_t, true>::do_thousands_sep() const
981e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_mon_thousands_sep(_M_monetary); }
982e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
983e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring moneypunct_byname<wchar_t, true>::do_grouping() const
984e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_mon_grouping(_M_monetary); }
985e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
986e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline wstring __do_widen (string const& str) {
987e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_NO_MEMBER_TEMPLATES) || defined (_STLP_MSVC)
988e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wstring::_Reserve_t __Reserve;
989e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t __size = str.size();
990e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wstring result(__Reserve, __size);
991e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  copy(str.begin(), str.end(), result.begin());
992e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
993e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  wstring result(str.begin(), str.end());
994e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
995e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return result;
996e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
997e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
998e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwstring moneypunct_byname<wchar_t, true>::do_curr_symbol() const
999e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ wchar_t buf[16]; return _WLocale_int_curr_symbol(_M_monetary, _STLP_ARRAY_AND_SIZE(buf)); }
1000e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1001e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwstring moneypunct_byname<wchar_t, true>::do_positive_sign() const
1002e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ wchar_t buf[16]; return _WLocale_positive_sign(_M_monetary, _STLP_ARRAY_AND_SIZE(buf)); }
1003e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1004e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwstring moneypunct_byname<wchar_t, true>::do_negative_sign() const
1005e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ wchar_t buf[16]; return _WLocale_negative_sign(_M_monetary, _STLP_ARRAY_AND_SIZE(buf)); }
1006e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1007e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint moneypunct_byname<wchar_t, true>::do_frac_digits() const
1008e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_int_frac_digits(_M_monetary); }
1009e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1010e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottmoneypunct_byname<wchar_t, false>::moneypunct_byname(const char * name,
1011e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                     size_t refs)
1012e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : moneypunct<wchar_t, false>(refs) {
1013e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!name)
1014e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_null_name() ;
1015e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1016e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int __err_code;
1017e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buf[_Locale_MAX_SIMPLE_NAME];
1018e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _M_monetary = _STLP_PRIV __acquire_monetary(name, buf, 0, &__err_code);
1019e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!_M_monetary)
1020e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale::_M_throw_on_creation_failure(__err_code, name, "moneypunct");
1021e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1022e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV _Init_monetary_formats(_M_pos_format, _M_neg_format, _M_monetary);
1023e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1024e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1025e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottmoneypunct_byname<wchar_t, false>::moneypunct_byname(_Locale_monetary *__mon)
1026e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  : _M_monetary(__mon) {
1027e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV _Init_monetary_formats(_M_pos_format, _M_neg_format, _M_monetary);
1028e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1029e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1030e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottmoneypunct_byname<wchar_t, false>::~moneypunct_byname()
1031e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _STLP_PRIV __release_monetary(_M_monetary); }
1032e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1033e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwchar_t moneypunct_byname<wchar_t, false>::do_decimal_point() const
1034e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_mon_decimal_point(_M_monetary); }
1035e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1036e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwchar_t moneypunct_byname<wchar_t, false>::do_thousands_sep() const
1037e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_mon_thousands_sep(_M_monetary); }
1038e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1039e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstring moneypunct_byname<wchar_t, false>::do_grouping() const
1040e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_mon_grouping(_M_monetary); }
1041e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1042e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwstring moneypunct_byname<wchar_t, false>::do_curr_symbol() const
1043e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ wchar_t buf[16]; return _WLocale_currency_symbol(_M_monetary, _STLP_ARRAY_AND_SIZE(buf)); }
1044e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1045e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwstring moneypunct_byname<wchar_t, false>::do_positive_sign() const
1046e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ wchar_t buf[16]; return _WLocale_positive_sign(_M_monetary, _STLP_ARRAY_AND_SIZE(buf)); }
1047e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1048e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottwstring moneypunct_byname<wchar_t, false>::do_negative_sign() const
1049e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ wchar_t buf[16]; return _WLocale_negative_sign(_M_monetary, _STLP_ARRAY_AND_SIZE(buf)); }
1050e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1051e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint moneypunct_byname<wchar_t, false>::do_frac_digits() const
1052e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _Locale_frac_digits(_M_monetary); }
1053e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1054e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1055e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1056e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_END_NAMESPACE
1057e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1058