177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999
377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Silicon Graphics Computer Systems, Inc.
477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999
677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris Fomitchev
777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed
977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk.
1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted
1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies.
1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted,
1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was
1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice.
1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "stlport_prefix.h"
1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <hash_map>
2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <vector>
2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <locale>
2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <istream>
2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <algorithm>
2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <functional>
2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "c_locale.h"
3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "locale_impl.h"
3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "acquire_release.h"
3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE
3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//----------------------------------------------------------------------
3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// ctype_byname<char>
3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__DMC__)
3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DECLSPEC
4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerctype_byname<char>::ctype_byname(const char* name, size_t refs)
4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    : ctype<char>( 0, false, refs) {
4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!name)
4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_null_name();
4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int __err_code;
4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf[_Locale_MAX_SIMPLE_NAME];
4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_ctype = _STLP_PRIV __acquire_ctype(name, buf, 0, &__err_code);
4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!_M_ctype)
5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_creation_failure(__err_code, name, "ctype");
5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_init();
5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid ctype_byname<char>::_M_init() {
5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_ctype_table = _M_byname_table;
5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // We have to do this, instead of just pointer twiddling, because
5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // ctype_base::mask isn't the same type as _Locale_mask_t.
6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const _Locale_mask_t* p = _Locale_ctype_table(_M_ctype);
6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (size_t i = 0; i != table_size; ++i) {
6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_byname_table[i] = ctype_base::mask(p[i]);
6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerctype_byname<char>::~ctype_byname()
6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _STLP_PRIV __release_ctype(_M_ctype); }
6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar ctype_byname<char>::do_toupper(char c) const
7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (char)_Locale_toupper(_M_ctype, c); }
7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar ctype_byname<char>::do_tolower(char c) const
7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (char)_Locale_tolower(_M_ctype, c); }
7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char*
7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerctype_byname<char>::do_toupper(char* first, const char* last) const {
7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for ( ; first != last ; ++first)
7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    *first = (char)_Locale_toupper(_M_ctype, *first);
7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return last;
8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst char*
8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerctype_byname<char>::do_tolower(char* first, const char* last) const {
8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for ( ; first != last ; ++first)
8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    *first = (char)_Locale_tolower(_M_ctype, *first);
8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return last;
8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Some helper functions used in ctype<>::scan_is and scan_is_not.
9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_WCHAR_T)
9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE
9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// ctype_byname<wchar_t>
9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Ctype_byname_w_is_mask : public unary_function<wchar_t, bool> {
9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_mask_t M;
9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_ctype* M_ctp;
10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Ctype_byname_w_is_mask(_Locale_mask_t m, _Locale_ctype* c)
10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    : M(m), M_ctp(c) {}
10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  bool operator()(wchar_t c) const
10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { return _WLocale_ctype(M_ctp, c, M) != 0; }
10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE
10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__DMC__)
11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DECLSPEC
11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerctype_byname<wchar_t>::ctype_byname(const char* name, size_t refs)
11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : ctype<wchar_t>(refs) {
11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!name)
11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_null_name();
11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int __err_code;
11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf[_Locale_MAX_SIMPLE_NAME];
11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_ctype = _STLP_PRIV __acquire_ctype(name, buf, 0, &__err_code);
12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!_M_ctype)
12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_creation_failure(__err_code, name, "ctype");
12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerctype_byname<wchar_t>::~ctype_byname()
12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _STLP_PRIV __release_ctype(_M_ctype); }
12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbool ctype_byname<wchar_t>::do_is(ctype_base::mask  m, wchar_t c) const
12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _WLocale_ctype(_M_ctype, c, (_Locale_mask_t)m) != 0; }
12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst wchar_t*
13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerctype_byname<wchar_t>::do_is(const wchar_t* low, const wchar_t* high,
13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                             ctype_base::mask * m) const {
13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_mask_t all_bits = _Locale_mask_t(ctype_base::space |
13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                           ctype_base::print |
13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                           ctype_base::cntrl |
13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                           ctype_base::upper |
13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                           ctype_base::lower |
13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                           ctype_base::alpha |
13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                           ctype_base::digit |
14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                           ctype_base::punct |
14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                           ctype_base::xdigit);
14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for ( ; low < high; ++low, ++m)
14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    *m = ctype_base::mask (_WLocale_ctype(_M_ctype, *low, all_bits));
14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return high;
14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst wchar_t*
14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerctype_byname<wchar_t>
15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ::do_scan_is(ctype_base::mask  m, const wchar_t* low, const wchar_t* high) const
15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return find_if(low, high, _STLP_PRIV _Ctype_byname_w_is_mask(m, _M_ctype)); }
15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst wchar_t*
15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerctype_byname<wchar_t>
15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ::do_scan_not(ctype_base::mask  m, const wchar_t* low, const wchar_t* high) const
15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return find_if(low, high, not1(_STLP_PRIV _Ctype_byname_w_is_mask(m, _M_ctype))); }
15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwchar_t ctype_byname<wchar_t>::do_toupper(wchar_t c) const
15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _WLocale_toupper(_M_ctype, c); }
16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst wchar_t*
16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerctype_byname<wchar_t>::do_toupper(wchar_t* low, const wchar_t* high) const {
16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for ( ; low < high; ++low)
16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    *low = _WLocale_toupper(_M_ctype, *low);
16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return high;
16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
16877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwchar_t ctype_byname<wchar_t>::do_tolower(wchar_t c) const
16977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _WLocale_tolower(_M_ctype, c); }
17077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
17177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst wchar_t*
17277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerctype_byname<wchar_t>::do_tolower(wchar_t* low, const wchar_t* high) const {
17377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for ( ; low < high; ++low)
17477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    *low = _WLocale_tolower(_M_ctype, *low);
17577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return high;
17677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
17777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
17877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* WCHAR_T */
17977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
18077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// collate_byname<char>
18177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__DMC__)
18277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DECLSPEC
18377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
18477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercollate_byname<char>::collate_byname(const char* name, size_t refs)
18577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : collate<char>(refs) {
18677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!name)
18777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_null_name();
18877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
18977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int __err_code;
19077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf[_Locale_MAX_SIMPLE_NAME];
19177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_collate = _STLP_PRIV __acquire_collate(name, buf, 0, &__err_code);
19277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!_M_collate)
19377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_creation_failure(__err_code, name, "collate");
19477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
19577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
19677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercollate_byname<char>::~collate_byname()
19777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _STLP_PRIV __release_collate(_M_collate); }
19877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
19977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint collate_byname<char>::do_compare(const char* __low1,
20077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                     const char* __high1,
20177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                     const char* __low2,
20277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                     const char* __high2) const {
20377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return _Locale_strcmp(_M_collate,
20477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                        __low1, __high1 - __low1,
20577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                        __low2, __high2 - __low2);
20677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
20777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
20877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercollate_byname<char>::string_type
20977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercollate_byname<char>::do_transform(const char* low, const char* high) const {
21077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (low == high)
21177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return string_type();
21277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t n = _Locale_strxfrm(_M_collate, NULL, 0, low, high - low);
21477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // NOT PORTABLE.  What we're doing relies on internal details of the
21677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // string implementation.  (Contiguity of string elements and presence
21777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // of trailing zero.)
21877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string_type buf(n, 0);
21977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Locale_strxfrm(_M_collate, &(*buf.begin()), n + 1, low, high - low);
22077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return buf;
22177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
22277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
22377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
22477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_WCHAR_T)
22577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
22677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// collate_byname<wchar_t>
22777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
22877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__DMC__)
22977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DECLSPEC
23077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
23177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercollate_byname<wchar_t>::collate_byname(const char* name, size_t refs)
23277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : collate<wchar_t>(refs) {
23377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!name)
23477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_null_name();
23577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
23677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int __err_code;
23777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf[_Locale_MAX_SIMPLE_NAME];
23877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_collate = _STLP_PRIV __acquire_collate(name, buf, 0, &__err_code);
23977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!_M_collate)
24077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_creation_failure(__err_code, name, "collate");
24177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
24277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
24377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercollate_byname<wchar_t>::~collate_byname()
24477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _STLP_PRIV __release_collate(_M_collate); }
24577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
24677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint collate_byname<wchar_t>::do_compare(const wchar_t* low1,
24777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                        const wchar_t* high1,
24877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                        const wchar_t* low2,
24977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                        const wchar_t* high2) const {
25077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return _WLocale_strcmp(_M_collate,
25177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                         low1, high1 - low1,
25277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                         low2, high2 - low2);
25377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
25477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
25577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercollate_byname<wchar_t>::string_type
25677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercollate_byname<wchar_t>::do_transform(const wchar_t* low,
25777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                      const wchar_t* high) const {
25877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (low == high)
25977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return string_type();
26077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
26177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t n = _WLocale_strxfrm(_M_collate, NULL, 0, low, high - low);
26277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
26377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // NOT PORTABLE.  What we're doing relies on internal details of the
26477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // string implementation.  (Contiguity of string elements and presence
26577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // of trailing zero.)
26677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string_type buf(n, 0);
26777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _WLocale_strxfrm(_M_collate, &(*buf.begin()), n + 1, low, high - low);
26877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return buf;
26977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
27077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
27177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /*  _STLP_NO_WCHAR_T */
27277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
27377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//----------------------------------------------------------------------
27477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// codecvt_byname<char>
27577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
27677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt_byname<char, char, mbstate_t>
27777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ::codecvt_byname(const char* name, size_t refs)
27877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    : codecvt<char, char, mbstate_t>(refs) {
27977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!name)
28077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_null_name();
28177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
28277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
28377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt_byname<char, char, mbstate_t>::~codecvt_byname() {}
28477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
28577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
28677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_WCHAR_T)
28777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
28877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//----------------------------------------------------------------------
28977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// codecvt_byname<wchar_t>
29077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt_byname<wchar_t, char, mbstate_t>::codecvt_byname(const char* name, size_t refs)
29177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : codecvt<wchar_t, char, mbstate_t>(refs) {
29277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!name)
29377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_null_name();
29477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
29577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int __err_code;
29677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf[_Locale_MAX_SIMPLE_NAME];
29777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_codecvt = _STLP_PRIV __acquire_codecvt(name, buf, 0, &__err_code);
29877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!_M_codecvt)
29977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_creation_failure(__err_code, name, "ctype");
30077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
30177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
30277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt_byname<wchar_t, char, mbstate_t>::~codecvt_byname()
30377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _STLP_PRIV __release_codecvt(_M_codecvt); }
30477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
30577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt<wchar_t, char, mbstate_t>::result
30677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt_byname<wchar_t, char, mbstate_t>::do_out(state_type&         state,
30777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                 const intern_type*  from,
30877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                 const intern_type*  from_end,
30977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                 const intern_type*& from_next,
31077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                 extern_type*        to,
31177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                 extern_type*        to_limit,
31277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                 extern_type*&       to_next) const {
31377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while (from != from_end && to != to_limit) {
31477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size_t chars_stored = _WLocale_wctomb(_M_codecvt,
31577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                          to, to_limit - to, *from,
31677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                          &state);
31777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (chars_stored == (size_t) -1) {
31877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      from_next = from;
31977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      to_next   = to;
32077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return error;
32177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
32277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else if (chars_stored == (size_t) -2) {
32377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      from_next = from;
32477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      to_next   = to;
32577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return partial;
32677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
32777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
32877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ++from;
32977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    to += chars_stored;
33077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
33177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
33277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  from_next = from;
33377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  to_next   = to;
33477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return ok;
33577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
33677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
33777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt<wchar_t, char, mbstate_t>::result
33877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt_byname<wchar_t, char, mbstate_t>::do_in(state_type&         state,
33977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                const extern_type*  from,
34077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                const extern_type*  from_end,
34177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                const extern_type*& from_next,
34277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                intern_type*        to,
34377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                intern_type*        to_end,
34477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                intern_type*&       to_next) const {
34577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while (from != from_end && to != to_end) {
34677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size_t chars_read = _WLocale_mbtowc(_M_codecvt,
34777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                        to, from, from_end - from,
34877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                        &state);
34977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (chars_read == (size_t) -1) {
35077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      from_next = from;
35177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      to_next   = to;
35277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return error;
35377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
35477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
35577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (chars_read == (size_t) -2) {
35677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      from_next = from;
35777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      to_next   = to;
35877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return partial;
35977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
36077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
36177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    from += chars_read;
36277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    to++;
36377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
36477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
36577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  from_next = from;
36677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  to_next   = to;
36777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return ok;
36877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
36977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
37077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt<wchar_t, char, mbstate_t>::result
37177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt_byname<wchar_t, char, mbstate_t>::do_unshift(state_type&   state,
37277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                     extern_type*  to,
37377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                     extern_type*  to_limit,
37477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                     extern_type*& to_next) const {
37577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  to_next = to;
37677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t result = _WLocale_unshift(_M_codecvt, &state,
37777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                   to, to_limit - to, &to_next);
37877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (result == (size_t) -1)
37977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return error;
38077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else if (result == (size_t) -2)
38177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return partial;
38277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else
38377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    if defined (__ISCPP__)
38477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return /*to_next == to ? noconv :*/ ok;
38577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    else
38677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return to_next == to ? noconv : ok;
38777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    endif
38877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
38977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
39077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint
39177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt_byname<wchar_t, char, mbstate_t>::do_encoding() const _STLP_NOTHROW {
39277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (_WLocale_is_stateless(_M_codecvt)) {
39377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    int max_width = _WLocale_mb_cur_max(_M_codecvt);
39477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    int min_width = _WLocale_mb_cur_min(_M_codecvt);
39577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return min_width == max_width ? min_width : 0;
39677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
39777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else
39877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return -1;
39977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
40077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
40177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbool
40277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt_byname<wchar_t, char, mbstate_t>::do_always_noconv() const _STLP_NOTHROW
40377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return false; }
40477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
40577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint
40677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt_byname<wchar_t, char, mbstate_t>::do_length(state_type&         state,
40777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                    const  extern_type* from,
40877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                    const  extern_type* end,
40977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                    size_t              mx) const {
41077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t __count = 0;
41177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  while (from != end && mx--) {
41277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    intern_type __dummy;
41377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size_t chars_read = _WLocale_mbtowc(_M_codecvt,
41477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                        &__dummy, from, end - from,
41577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                        &state);
41677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if ((chars_read == (size_t) -1) || (chars_read == (size_t) -2)) // error or partial
41777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
41877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __count += chars_read;
41977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    from += chars_read;
42077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
42177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return int(__count);
42277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
42377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
42477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint
42577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnercodecvt_byname<wchar_t, char, mbstate_t>::do_max_length() const _STLP_NOTHROW
42677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _WLocale_mb_cur_max(_M_codecvt); }
42777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
42877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
42977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// numpunct_byname<char>
43077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnernumpunct_byname<char>::numpunct_byname(const char* name, size_t refs)
43177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner: numpunct<char>(refs) {
43277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!name)
43377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_null_name();
43477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
43577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int __err_code;
43677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf[_Locale_MAX_SIMPLE_NAME];
43777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_numeric = _STLP_PRIV __acquire_numeric(name, buf, 0, &__err_code);
43877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!_M_numeric)
43977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_creation_failure(__err_code, name, "numpunct");
44077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
44177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
44277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnernumpunct_byname<char>::~numpunct_byname()
44377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _STLP_PRIV __release_numeric(_M_numeric); }
44477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
44577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar numpunct_byname<char>::do_decimal_point() const
44677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_decimal_point(_M_numeric); }
44777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
44877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar numpunct_byname<char>::do_thousands_sep() const
44977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_thousands_sep(_M_numeric); }
45077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
45177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring numpunct_byname<char>::do_grouping() const {
45277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char * __grouping = _Locale_grouping(_M_numeric);
45377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__grouping != NULL && __grouping[0] == CHAR_MAX)
45477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __grouping = "";
45577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __grouping;
45677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
45777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
45877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring numpunct_byname<char>::do_truename() const
45977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_true(_M_numeric); }
46077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
46177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring numpunct_byname<char>::do_falsename() const
46277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_false(_M_numeric); }
46377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
46477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//----------------------------------------------------------------------
46577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// numpunct<wchar_t>
46677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
46777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_WCHAR_T)
46877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
46977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// numpunct_byname<wchar_t>
47077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
47177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnernumpunct_byname<wchar_t>::numpunct_byname(const char* name, size_t refs)
47277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner: numpunct<wchar_t>(refs) {
47377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!name)
47477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_null_name();
47577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
47677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int __err_code;
47777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf[_Locale_MAX_SIMPLE_NAME];
47877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_numeric = _STLP_PRIV __acquire_numeric(name, buf, 0, &__err_code);
47977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!_M_numeric)
48077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_creation_failure(__err_code, name, "numpunct");
48177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
48277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
48377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnernumpunct_byname<wchar_t>::~numpunct_byname()
48477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _STLP_PRIV __release_numeric(_M_numeric); }
48577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
48677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwchar_t numpunct_byname<wchar_t>::do_decimal_point() const
48777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _WLocale_decimal_point(_M_numeric); }
48877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
48977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwchar_t numpunct_byname<wchar_t>::do_thousands_sep() const
49077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _WLocale_thousands_sep(_M_numeric); }
49177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
49277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring numpunct_byname<wchar_t>::do_grouping() const {
49377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const char * __grouping = _Locale_grouping(_M_numeric);
49477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__grouping != NULL && __grouping[0] == CHAR_MAX)
49577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    __grouping = "";
49677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __grouping;
49777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
49877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
49977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwstring numpunct_byname<wchar_t>::do_truename() const {
50077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wchar_t buf[16];
50177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return _WLocale_true(_M_numeric, _STLP_ARRAY_AND_SIZE(buf));
50277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
50377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
50477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwstring numpunct_byname<wchar_t>::do_falsename() const {
50577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wchar_t buf[16];
50677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return _WLocale_false(_M_numeric, _STLP_ARRAY_AND_SIZE(buf));
50777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
50877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
50977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
51077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
51177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE
51277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
51377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic void _Init_monetary_formats(money_base::pattern& pos_format,
51477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                   money_base::pattern& neg_format,
51577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                   _Locale_monetary * monetary) {
51677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  switch (_Locale_p_sign_posn(monetary)) {
51777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 0: // Parentheses surround the quantity and currency symbol
51877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 1: // The sign string precedes the quantity and currency symbol
51977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[0] = (char) money_base::sign;
52077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (_Locale_p_cs_precedes(monetary)) {
52177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 1 if currency symbol precedes a positive value
52277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[1] = (char) money_base::symbol;
52377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (_Locale_p_sep_by_space(monetary)) {
52477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space separates currency symbol from a positive value.
52577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[2] = (char) money_base::space;
52677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[3] = (char) money_base::value;
52777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        } else {
52877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space not separates currency symbol from a positive value.
52977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[2] = (char) money_base::value;
53077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[3] = (char) money_base::none;
53177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
53277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      } else {
53377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 0 if currency symbol succeeds a positive value
53477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[1] = (char) money_base::value;
53577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (_Locale_p_sep_by_space(monetary)) {
53677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space separates currency symbol from a positive value.
53777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[2] = (char) money_base::space;
53877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[3] = (char) money_base::symbol;
53977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        } else {
54077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space not separates currency symbol from a positive value.
54177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[2] = (char) money_base::symbol;
54277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[3] = (char) money_base::none;
54377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
54477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
54577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
54677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 2: // The sign string succeeds the quantity and currency symbol.
54777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (_Locale_p_cs_precedes(monetary)) {
54877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 1 if currency symbol precedes a positive value
54977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[0] = (char) money_base::symbol;
55077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (_Locale_p_sep_by_space(monetary)) {
55177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space separates currency symbol from a positive value.
55277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[1] = (char) money_base::space;
55377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[2] = (char) money_base::value;
55477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[3] = (char) money_base::sign;
55577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        } else {
55677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space not separates currency symbol from a positive value.
55777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[1] = (char) money_base::value;
55877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[2] = (char) money_base::sign;
55977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[3] = (char) money_base::none;
56077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
56177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      } else {
56277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 0 if currency symbol succeeds a positive value
56377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[0] = (char) money_base::value;
56477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (_Locale_p_sep_by_space(monetary)) {
56577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space separates currency symbol from a positive value.
56677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[1] = (char) money_base::space;
56777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[2] = (char) money_base::symbol;
56877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[3] = (char) money_base::sign;
56977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        } else {
57077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space not separates currency symbol from a positive value.
57177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[1] = (char) money_base::symbol;
57277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[2] = (char) money_base::sign;
57377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[3] = (char) money_base::none;
57477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
57577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
57677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
57777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 3: // The sign string immediately precedes the currency symbol.
57877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (_Locale_p_cs_precedes(monetary)) {
57977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 1 if currency symbol precedes a positive value
58077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[0] = (char) money_base::sign;
58177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[1] = (char) money_base::symbol;
58277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (_Locale_p_sep_by_space(monetary)) {
58377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space separates currency symbol from a positive value.
58477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[2] = (char) money_base::space;
58577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[3] = (char) money_base::value;
58677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        } else {
58777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space not separates currency symbol from a positive value.
58877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[2] = (char) money_base::value;
58977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[3] = (char) money_base::none;
59077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
59177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      } else {
59277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 0 if currency symbol succeeds a positive value
59377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[0] = (char) money_base::value;
59477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[1] = (char) money_base::sign;
59577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[2] = (char) money_base::symbol;
59677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[3] = (char) money_base::none;
59777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
59877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
59977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 4: // The sign string immediately succeeds the currency symbol.
60077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (_Locale_p_cs_precedes(monetary)) {
60177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 1 if currency symbol precedes a positive value
60277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[0] = (char) money_base::symbol;
60377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[1] = (char) money_base::sign;
60477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[2] = (char) money_base::value;
60577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[3] = (char) money_base::none;
60677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      } else {
60777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 0 if currency symbol succeeds a positive value
60877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[0] = (char) money_base::value;
60977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (_Locale_p_sep_by_space(monetary)) {
61077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space separates currency symbol from a positive value.
61177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[1] = (char) money_base::space;
61277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[2] = (char) money_base::symbol;
61377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[3] = (char) money_base::sign;
61477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        } else {
61577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space not separates currency symbol from a positive value.
61677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[1] = (char) money_base::symbol;
61777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[2] = (char) money_base::sign;
61877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          pos_format.field[3] = (char) money_base::none;
61977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
62077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
62177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
62277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    default: // Default C++ Standard format
62377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[0] = (char) money_base::symbol;
62477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[1] = (char) money_base::sign;
62577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[2] = (char) money_base::none;
62677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[3] = (char) money_base::value;
62777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
62877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
62977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
63077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  switch (_Locale_n_sign_posn(monetary)) {
63177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 0: // Parentheses surround the quantity and currency symbol
63277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 1: // The sign string precedes the quantity and currency symbol
63377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[0] = (char) money_base::sign;
63477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (_Locale_n_cs_precedes(monetary)) {
63577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 1 if currency symbol precedes a negative value
63677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[1] = (char) money_base::symbol;
63777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (_Locale_n_sep_by_space(monetary)) {
63877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space separates currency symbol from a negative value.
63977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[2] = (char) money_base::space;
64077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[3] = (char) money_base::value;
64177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        } else {
64277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space not separates currency symbol from a negative value.
64377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[2] = (char) money_base::value;
64477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[3] = (char) money_base::none;
64577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
64677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      } else {
64777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 0 if currency symbol succeeds a negative value
64877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[1] = (char) money_base::value;
64977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (_Locale_n_sep_by_space(monetary)) {
65077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space separates currency symbol from a negative value.
65177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[2] = (char) money_base::space;
65277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[3] = (char) money_base::symbol;
65377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        } else {
65477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space not separates currency symbol from a negative value.
65577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[2] = (char) money_base::symbol;
65677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[3] = (char) money_base::none;
65777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
65877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
65977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
66077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 2: // The sign string succeeds the quantity and currency symbol.
66177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (_Locale_n_cs_precedes(monetary)) {
66277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 1 if currency symbol precedes a negative value
66377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[0] = (char) money_base::symbol;
66477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (_Locale_n_sep_by_space(monetary)) {
66577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space separates currency symbol from a negative value.
66677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[1] = (char) money_base::space;
66777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[2] = (char) money_base::value;
66877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[3] = (char) money_base::sign;
66977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        } else {
67077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space not separates currency symbol from a negative value.
67177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[1] = (char) money_base::value;
67277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[2] = (char) money_base::sign;
67377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[3] = (char) money_base::none;
67477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
67577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      } else {
67677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 0 if currency symbol succeeds a negative value
67777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[0] = (char) money_base::value;
67877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (_Locale_n_sep_by_space(monetary)) {
67977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space separates currency symbol from a negative value.
68077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[1] = (char) money_base::space;
68177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[2] = (char) money_base::symbol;
68277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[3] = (char) money_base::sign;
68377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        } else {
68477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space not separates currency symbol from a negative value.
68577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[1] = (char) money_base::symbol;
68677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[2] = (char) money_base::sign;
68777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[3] = (char) money_base::none;
68877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
68977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
69077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
69177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 3: // The sign string immediately precedes the currency symbol.
69277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (_Locale_n_cs_precedes(monetary)) {
69377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 1 if currency symbol precedes a negative value
69477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[0] = (char) money_base::sign;
69577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[1] = (char) money_base::symbol;
69677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (_Locale_n_sep_by_space(monetary)) {
69777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space separates currency symbol from a negative value.
69877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[2] = (char) money_base::space;
69977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[3] = (char) money_base::value;
70077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        } else {
70177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space not separates currency symbol from a negative value.
70277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[2] = (char) money_base::value;
70377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[3] = (char) money_base::none;
70477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
70577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      } else {
70677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 0 if currency symbol succeeds a negative value
70777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[0] = (char) money_base::value;
70877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[1] = (char) money_base::sign;
70977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[2] = (char) money_base::symbol;
71077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[3] = (char) money_base::none;
71177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
71277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
71377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 4: // The sign string immediately succeeds the currency symbol.
71477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (_Locale_n_cs_precedes(monetary)) {
71577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 1 if currency symbol precedes a negative value
71677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[0] = (char) money_base::symbol;
71777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[1] = (char) money_base::sign;
71877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[2] = (char) money_base::none;
71977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[3] = (char) money_base::value;
72077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      } else {
72177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 0 if currency symbol succeeds a negative value
72277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[0] = (char) money_base::value;
72377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        if (_Locale_n_sep_by_space(monetary)) {
72477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space separates currency symbol from a negative value.
72577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[1] = (char) money_base::space;
72677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[2] = (char) money_base::symbol;
72777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[3] = (char) money_base::sign;
72877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        } else {
72977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          // a space not separates currency symbol from a negative value.
73077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[1] = (char) money_base::symbol;
73177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[2] = (char) money_base::sign;
73277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          neg_format.field[3] = (char) money_base::none;
73377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        }
73477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
73577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
73677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    default: // Default C++ Standard format
73777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[0] = (char) money_base::symbol;
73877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[1] = (char) money_base::sign;
73977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[2] = (char) money_base::none;
74077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[3] = (char) money_base::value;
74177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
74277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
74377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
74477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
74577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// international variant of monetary
74677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
74777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
74877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * int_curr_symbol
74977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
75077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *   The international currency symbol. The operand is a four-character
75177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *   string, with the first three characters containing the alphabetic
75277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *   international currency symbol in accordance with those specified
75377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *   in the ISO 4217 specification. The fourth character is the character used
75477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *   to separate the international currency symbol from the monetary quantity.
75577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
75677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * (http://www.opengroup.org/onlinepubs/7990989775/xbd/locale.html)
75777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
75877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
75977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
76077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Standards are unclear in the usage of international currency
76177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * and monetary formats.
76277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * But I am expect that international currency symbol should be the first
76377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * (not depends upon where currency symbol situated in the national
76477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * format).
76577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
76677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * If this isn't so, let's see:
76777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *       1 234.56 RUR
76877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *       GBP 1,234.56
76977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *       USD 1,234.56
77077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * The situation really is worse than you see above:
77177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * RUR typed wrong here---it prints '1 234.56 RUR ' (see space after RUR).
77277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This is due to intl_fmp.curr_symbol() == "RUR ". (see reference in comments
77377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * above).
77477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
77577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
77677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
77777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstatic void _Init_monetary_formats_int(money_base::pattern& pos_format,
77877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                       money_base::pattern& neg_format,
77977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                       _Locale_monetary * monetary)
78077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
78177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
78277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  switch (_Locale_p_sign_posn(monetary)) {
78377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 0: // Parentheses surround the quantity and currency symbol
78477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 1: // The sign string precedes the quantity and currency symbol
78577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[0] = (char) money_base::symbol;
78677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[1] = (char) money_base::sign;
78777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[2] = (char) money_base::value;
78877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[3] = (char) money_base::none;
78977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
79077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 2: // The sign string succeeds the quantity and currency symbol.
79177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[0] = (char) money_base::symbol;
79277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[1] = (char) money_base::value;
79377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[2] = (char) money_base::sign;
79477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[3] = (char) money_base::none;
79577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
79677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 3: // The sign string immediately precedes the currency symbol.
79777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 4: // The sign string immediately succeeds the currency symbol.
79877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[0] = (char) money_base::symbol;
79977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (_Locale_p_cs_precedes(monetary)) {
80077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 1 if currency symbol precedes a positive value
80177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[1] = (char) money_base::sign;
80277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[2] = (char) money_base::value;
80377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      } else {
80477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 0 if currency symbol succeeds a positive value
80577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[1] = (char) money_base::value;
80677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        pos_format.field[2] = (char) money_base::sign;
80777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
80877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[3] = (char) money_base::none;
80977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
81077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    default: // Default C++ Standard format
81177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[0] = (char) money_base::symbol;
81277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[1] = (char) money_base::sign;
81377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[2] = (char) money_base::none;
81477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      pos_format.field[3] = (char) money_base::value;
81577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
81677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
81777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
81877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
81977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  switch (_Locale_n_sign_posn(monetary)) {
82077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 0: // Parentheses surround the quantity and currency symbol
82177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 1: // The sign string precedes the quantity and currency symbol
82277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[0] = (char) money_base::symbol;
82377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[1] = (char) money_base::sign;
82477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[2] = (char) money_base::value;
82577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[3] = (char) money_base::none;
82677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
82777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 2: // The sign string succeeds the quantity and currency symbol.
82877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[0] = (char) money_base::symbol;
82977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[1] = (char) money_base::value;
83077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[2] = (char) money_base::sign;
83177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[3] = (char) money_base::none;
83277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
83377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 3: // The sign string immediately precedes the currency symbol.
83477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    case 4: // The sign string immediately succeeds the currency symbol.
83577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[0] = (char) money_base::symbol;
83677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (_Locale_n_cs_precedes(monetary)) {
83777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 1 if currency symbol precedes a negative value
83877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[1] = (char) money_base::sign;
83977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[2] = (char) money_base::value;
84077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      } else {
84177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        // 0 if currency symbol succeeds a negative value
84277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[1] = (char) money_base::value;
84377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        neg_format.field[2] = (char) money_base::sign;
84477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      }
84577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[3] = (char) money_base::none;
84677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
84777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    default: // Default C++ Standard format
84877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[0] = (char) money_base::symbol;
84977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[1] = (char) money_base::sign;
85077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[2] = (char) money_base::none;
85177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      neg_format.field[3] = (char) money_base::value;
85277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      break;
85377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
85477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
85577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
85677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE
85777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
85877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
85977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// moneypunct_byname<>
86077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
86177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnermoneypunct_byname<char, true>::moneypunct_byname(const char * name,
86277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                 size_t refs)
86377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    : moneypunct<char, true>(refs) {
86477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!name)
86577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_null_name();
86677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
86777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int __err_code;
86877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf[_Locale_MAX_SIMPLE_NAME];
86977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_monetary = _STLP_PRIV __acquire_monetary(name, buf, 0, &__err_code);
87077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!_M_monetary)
87177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_creation_failure(__err_code, name, "moneypunct");
87277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
87377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_PRIV _Init_monetary_formats_int(_M_pos_format, _M_neg_format, _M_monetary);
87477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
87577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
87677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnermoneypunct_byname<char, true>::moneypunct_byname(_Locale_monetary *__mon)
87777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : _M_monetary(__mon) {
87877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_PRIV _Init_monetary_formats_int(_M_pos_format, _M_neg_format, _M_monetary);
87977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
88077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
88177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnermoneypunct_byname<char, true>::~moneypunct_byname()
88277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _STLP_PRIV __release_monetary(_M_monetary); }
88377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
88477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar moneypunct_byname<char, true>::do_decimal_point() const
88577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_mon_decimal_point(_M_monetary); }
88677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
88777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar moneypunct_byname<char, true>::do_thousands_sep() const
88877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_mon_thousands_sep(_M_monetary); }
88977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
89077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring moneypunct_byname<char, true>::do_grouping() const
89177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_mon_grouping(_M_monetary); }
89277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
89377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring moneypunct_byname<char, true>::do_curr_symbol() const
89477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_int_curr_symbol(_M_monetary); }
89577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
89677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring moneypunct_byname<char, true>::do_positive_sign() const
89777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_positive_sign(_M_monetary); }
89877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
89977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring moneypunct_byname<char, true>::do_negative_sign() const
90077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_negative_sign(_M_monetary); }
90177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
90277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint moneypunct_byname<char, true>::do_frac_digits() const
90377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_int_frac_digits(_M_monetary); }
90477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
90577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnermoneypunct_byname<char, false>::moneypunct_byname(const char * name,
90677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                  size_t refs)
90777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    : moneypunct<char, false>(refs) {
90877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!name)
90977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_null_name();
91077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
91177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int __err_code;
91277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf[_Locale_MAX_SIMPLE_NAME];
91377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_monetary = _STLP_PRIV __acquire_monetary(name, buf, 0, &__err_code);
91477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!_M_monetary)
91577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_creation_failure(__err_code, name, "moneypunct");
91677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
91777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_PRIV _Init_monetary_formats(_M_pos_format, _M_neg_format, _M_monetary);
91877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
91977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
92077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnermoneypunct_byname<char, false>::moneypunct_byname(_Locale_monetary *__mon)
92177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : _M_monetary(__mon) {
92277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_PRIV _Init_monetary_formats(_M_pos_format, _M_neg_format, _M_monetary);
92377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
92477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
92577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnermoneypunct_byname<char, false>::~moneypunct_byname()
92677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _STLP_PRIV __release_monetary(_M_monetary); }
92777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
92877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar moneypunct_byname<char, false>::do_decimal_point() const
92977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_mon_decimal_point(_M_monetary); }
93077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
93177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar moneypunct_byname<char, false>::do_thousands_sep() const
93277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_mon_thousands_sep(_M_monetary); }
93377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
93477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring moneypunct_byname<char, false>::do_grouping() const
93577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_mon_grouping(_M_monetary); }
93677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
93777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring moneypunct_byname<char, false>::do_curr_symbol() const
93877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_currency_symbol(_M_monetary); }
93977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
94077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring moneypunct_byname<char, false>::do_positive_sign() const
94177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_positive_sign(_M_monetary); }
94277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
94377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring moneypunct_byname<char, false>::do_negative_sign() const
94477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_negative_sign(_M_monetary); }
94577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
94677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint moneypunct_byname<char, false>::do_frac_digits() const
94777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_frac_digits(_M_monetary); }
94877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
94977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
95077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// moneypunct_byname<wchar_t>
95177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
95277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_WCHAR_T)
95377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
95477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnermoneypunct_byname<wchar_t, true>::moneypunct_byname(const char * name,
95577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                    size_t refs)
95677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    : moneypunct<wchar_t, true>(refs) {
95777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!name)
95877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_null_name();
95977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
96077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int __err_code;
96177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf[_Locale_MAX_SIMPLE_NAME];
96277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_monetary = _STLP_PRIV __acquire_monetary(name, buf, 0, &__err_code);
96377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!_M_monetary)
96477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_creation_failure(__err_code, name, "moneypunct");
96577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
96677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_PRIV _Init_monetary_formats_int(_M_pos_format, _M_neg_format, _M_monetary);
96777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
96877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
96977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnermoneypunct_byname<wchar_t, true>::moneypunct_byname(_Locale_monetary *__mon)
97077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : _M_monetary(__mon) {
97177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_PRIV _Init_monetary_formats_int(_M_pos_format, _M_neg_format, _M_monetary);
97277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
97377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
97477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnermoneypunct_byname<wchar_t, true>::~moneypunct_byname()
97577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _STLP_PRIV __release_monetary(_M_monetary); }
97677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
97777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwchar_t moneypunct_byname<wchar_t, true>::do_decimal_point() const
97877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_mon_decimal_point(_M_monetary); }
97977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
98077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwchar_t moneypunct_byname<wchar_t, true>::do_thousands_sep() const
98177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_mon_thousands_sep(_M_monetary); }
98277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
98377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring moneypunct_byname<wchar_t, true>::do_grouping() const
98477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_mon_grouping(_M_monetary); }
98577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
98677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline wstring __do_widen (string const& str) {
98777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_NO_MEMBER_TEMPLATES) || defined (_STLP_MSVC)
98877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wstring::_Reserve_t __Reserve;
98977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t __size = str.size();
99077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wstring result(__Reserve, __size);
99177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  copy(str.begin(), str.end(), result.begin());
99277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
99377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wstring result(str.begin(), str.end());
99477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
99577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return result;
99677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
99777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
99877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwstring moneypunct_byname<wchar_t, true>::do_curr_symbol() const
99977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ wchar_t buf[16]; return _WLocale_int_curr_symbol(_M_monetary, _STLP_ARRAY_AND_SIZE(buf)); }
100077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
100177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwstring moneypunct_byname<wchar_t, true>::do_positive_sign() const
100277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ wchar_t buf[16]; return _WLocale_positive_sign(_M_monetary, _STLP_ARRAY_AND_SIZE(buf)); }
100377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
100477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwstring moneypunct_byname<wchar_t, true>::do_negative_sign() const
100577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ wchar_t buf[16]; return _WLocale_negative_sign(_M_monetary, _STLP_ARRAY_AND_SIZE(buf)); }
100677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
100777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint moneypunct_byname<wchar_t, true>::do_frac_digits() const
100877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_int_frac_digits(_M_monetary); }
100977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
101077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnermoneypunct_byname<wchar_t, false>::moneypunct_byname(const char * name,
101177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                     size_t refs)
101277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    : moneypunct<wchar_t, false>(refs) {
101377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!name)
101477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_null_name() ;
101577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
101677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int __err_code;
101777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf[_Locale_MAX_SIMPLE_NAME];
101877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _M_monetary = _STLP_PRIV __acquire_monetary(name, buf, 0, &__err_code);
101977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (!_M_monetary)
102077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    locale::_M_throw_on_creation_failure(__err_code, name, "moneypunct");
102177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
102277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_PRIV _Init_monetary_formats(_M_pos_format, _M_neg_format, _M_monetary);
102377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
102477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
102577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnermoneypunct_byname<wchar_t, false>::moneypunct_byname(_Locale_monetary *__mon)
102677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  : _M_monetary(__mon) {
102777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_PRIV _Init_monetary_formats(_M_pos_format, _M_neg_format, _M_monetary);
102877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
102977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
103077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnermoneypunct_byname<wchar_t, false>::~moneypunct_byname()
103177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ _STLP_PRIV __release_monetary(_M_monetary); }
103277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
103377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwchar_t moneypunct_byname<wchar_t, false>::do_decimal_point() const
103477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_mon_decimal_point(_M_monetary); }
103577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
103677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwchar_t moneypunct_byname<wchar_t, false>::do_thousands_sep() const
103777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_mon_thousands_sep(_M_monetary); }
103877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
103977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstring moneypunct_byname<wchar_t, false>::do_grouping() const
104077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_mon_grouping(_M_monetary); }
104177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
104277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwstring moneypunct_byname<wchar_t, false>::do_curr_symbol() const
104377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ wchar_t buf[16]; return _WLocale_currency_symbol(_M_monetary, _STLP_ARRAY_AND_SIZE(buf)); }
104477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
104577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwstring moneypunct_byname<wchar_t, false>::do_positive_sign() const
104677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ wchar_t buf[16]; return _WLocale_positive_sign(_M_monetary, _STLP_ARRAY_AND_SIZE(buf)); }
104777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
104877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwstring moneypunct_byname<wchar_t, false>::do_negative_sign() const
104977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ wchar_t buf[16]; return _WLocale_negative_sign(_M_monetary, _STLP_ARRAY_AND_SIZE(buf)); }
105077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
105177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint moneypunct_byname<wchar_t, false>::do_frac_digits() const
105277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _Locale_frac_digits(_M_monetary); }
105377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
105477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
105577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
105677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE
105777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
1058