19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_MONETARY_C
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_MONETARY_C
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef _STLP_INTERNAL_MONETARY_H
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_monetary.h>
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_IOS_H
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_ios.h>
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_NUM_PUT_H
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_num_put.h>
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_NUM_GET_H
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_num_get.h>
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _InputIterator>
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocklocale::id money_get<_CharT, _InputIterator>::id;
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _OutputIterator>
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocklocale::id money_put<_CharT, _OutputIterator>::id;
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// money_get facets
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// helper functions for do_get
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InIt1, class _InIt2>
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpair<_InIt1, bool> __get_string( _InIt1 __first, _InIt1 __last,
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 _InIt2 __str_first, _InIt2 __str_last) {
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  while ( __first != __last && __str_first != __str_last && *__first == *__str_first ) {
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__first;
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__str_first;
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return make_pair(__first, __str_first == __str_last);
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InIt, class _OuIt, class _CharT>
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__get_monetary_value(_InIt& __first, _InIt __last, _OuIt __out_ite,
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     const ctype<_CharT>& _c_type,
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     _CharT __point, int __frac_digits, _CharT __sep,
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     const string& __grouping, bool &__syntax_ok) {
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__first == __last || !_c_type.is(ctype_base::digit, *__first))
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return false;
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  char __group_sizes[128];
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  char* __group_sizes_end = __grouping.empty()? 0 : __group_sizes;
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  char   __current_group_size = 0;
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  while (__first != __last) {
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (_c_type.is(ctype_base::digit, *__first)) {
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__current_group_size;
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      *__out_ite++ = *__first++;
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else if (__group_sizes_end) {
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (*__first == __sep) {
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        *__group_sizes_end++ = __current_group_size;
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __current_group_size = 0;
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        ++__first;
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else break;
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      break;
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__grouping.empty())
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __syntax_ok = true;
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__group_sizes_end != __group_sizes)
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      *__group_sizes_end++ = __current_group_size;
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __syntax_ok = __valid_grouping(__group_sizes, __group_sizes_end,
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                   __grouping.data(), __grouping.data()+ __grouping.size());
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first == __last || *__first != __point) {
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      for (int __digits = 0; __digits != __frac_digits; ++__digits)
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        *__out_ite++ = _CharT('0');
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return true; // OK not to have decimal point
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ++__first;
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int __digits = 0;
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  while (__first != __last && _c_type.is(ctype_base::digit, *__first)) {
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      *__out_ite++ = *__first++;
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block     ++__digits;
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __syntax_ok = __syntax_ok && (__digits == __frac_digits);
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return true;
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _InputIter, class _StrType>
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_InputIter __money_do_get(_InputIter __s, _InputIter __end, bool  __intl,
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     ios_base&  __str, ios_base::iostate&  __err,
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     _StrType& __digits, bool &__is_positive, _CharT* /*__dummy*/) {
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__s == __end) {
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __err |= ios_base::eofbit;
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __s;
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _CharT char_type;
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _StrType string_type;
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _InputIter iter_type;
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef moneypunct<char_type, false> _Punct;
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef moneypunct<char_type, true>  _Punct_intl;
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ctype<char_type>             _Ctype;
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale __loc = __str.getloc();
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const _Punct&      __punct      = use_facet<_Punct>(__loc) ;
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const _Punct_intl& __punct_intl = use_facet<_Punct_intl>(__loc) ;
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const _Ctype&      __c_type     = use_facet<_Ctype>(__loc) ;
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  money_base::pattern __format = __intl ? __punct_intl.neg_format()
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                        : __punct.neg_format();
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  string_type __ns = __intl ? __punct_intl.negative_sign()
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                            : __punct.negative_sign();
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  string_type __ps = __intl ? __punct_intl.positive_sign()
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                            : __punct.positive_sign();
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int __i;
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __symbol_required = (__str.flags() & ios_base::showbase) != 0;
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  string_type __buf;
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  back_insert_iterator<string_type> __out_ite(__buf);
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for (__i = 0; __i < 4; ++__i) {
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    switch (__format.field[__i]) {
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    case money_base::space:
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (!__c_type.is(ctype_base::space, *__s)) {
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __err = ios_base::failbit;
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        return __s;
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__s;
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    case money_base::none:
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      while (__s != __end && __c_type.is(ctype_base::space, *__s))
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        ++__s;
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      break;
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    case money_base::symbol: {
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      string_type __curs = __intl ? __punct_intl.curr_symbol()
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                  : __punct.curr_symbol();
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      pair<iter_type, bool>
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __result  = __get_string(__s, __end, __curs.begin(), __curs.end());
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (!__result.second && __symbol_required)
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __err = ios_base::failbit;
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __s = __result.first;
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      break;
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    case money_base::sign: {
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__s == __end) {
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__ps.empty())
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          break;
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__ns.empty()) {
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __is_positive = false;
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          break;
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __err = ios_base::failbit;
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        return __s;
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__ps.empty()) {
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if (__ns.empty())
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            break;
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if (*__s == __ns[0]) {
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            ++__s;
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            __is_positive = false;
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          }
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          break;
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        else {
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if (*__s == __ps[0]) {
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            ++__s;
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            break;
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          }
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if (__ns.empty())
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            break;
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if (*__s == __ns[0]) {
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            ++__s;
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            __is_positive = false;
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            break;
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          }
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          __err = ios_base::failbit;
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return __s;
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    case money_base::value: {
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      char_type __point = __intl ? __punct_intl.decimal_point()
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 : __punct.decimal_point();
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      int __frac_digits = __intl ? __punct_intl.frac_digits()
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 : __punct.frac_digits();
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      string __grouping = __intl ? __punct_intl.grouping()
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 : __punct.grouping();
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      bool __syntax_ok = true;
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      bool __result;
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      char_type __sep = __grouping.empty() ? char_type() :
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __intl ? __punct_intl.thousands_sep() : __punct.thousands_sep();
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __result = __get_monetary_value(__s, __end, __out_ite, __c_type,
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      __point, __frac_digits,
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      __sep,
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      __grouping, __syntax_ok);
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (!__syntax_ok)
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __err |= ios_base::failbit;
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (!__result) {
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __err = ios_base::failbit;
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        return __s;
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      break;
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }                           // Close money_base::value case
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }                           // Close switch statement
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }                             // Close for loop
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__is_positive) {
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__ps.size() > 1) {
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      pair<_InputIter, bool>
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __result = __get_string(__s, __end, __ps.begin() + 1, __ps.end());
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __s = __result.first;
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (!__result.second)
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __err |= ios::failbit;
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!(__err & ios_base::failbit))
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __digits = __buf;
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__ns.size() > 1) {
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      pair<_InputIter, bool>
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __result = __get_string(__s, __end, __ns.begin() + 1, __ns.end());
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __s = __result.first;
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (!__result.second)
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __err |= ios::failbit;
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!(__err & ios::failbit)) {
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __digits = __c_type.widen('-');
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __digits += __buf;
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__s == __end)
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __err |= ios::eofbit;
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __s;
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//===== methods ======
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _InputIter>
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_InputIter
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockmoney_get<_CharT, _InputIter>::do_get(_InputIter __s, _InputIter  __end, bool  __intl,
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      ios_base&  __str, ios_base::iostate& __err,
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      _STLP_LONGEST_FLOAT_TYPE& __units) const {
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  string_type __buf;
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __is_positive = true;
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __s = _STLP_PRIV __money_do_get(__s, __end, __intl, __str, __err, __buf, __is_positive, (_CharT*)0);
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__err == ios_base::goodbit || __err == ios_base::eofbit) {
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typename string_type::iterator __b = __buf.begin(), __e = __buf.end();
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!__is_positive) ++__b;
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // Can't use atold, since it might be wchar_t. Don't get confused by name below :
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // it's perfectly capable of reading long double.
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_PRIV __get_decimal_integer(__b, __e, __units, (_CharT*)0);
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!__is_positive) {
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __units = -__units;
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __s;
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _InputIter>
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_InputIter
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockmoney_get<_CharT, _InputIter>::do_get(iter_type __s, iter_type  __end, bool  __intl,
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      ios_base&  __str, ios_base::iostate&  __err,
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      string_type& __digits) const {
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __is_positive = true;
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return _STLP_PRIV __money_do_get(__s, __end, __intl, __str, __err, __digits, __is_positive, (_CharT*)0);
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// money_put facets
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _OutputIter, class _Str_Type, class _Str>
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_OutputIter __money_do_put(_OutputIter __s, bool  __intl, ios_base&  __str,
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _CharT __fill, const _Str& __digits, bool __check_digits,
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _Str_Type * /*__dummy*/) {
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _CharT char_type;
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Str_Type string_type;
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ctype<char_type>             _Ctype;
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef moneypunct<char_type, false> _Punct;
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef moneypunct<char_type, true>  _Punct_intl;
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  locale __loc = __str.getloc();
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const _Ctype&      __c_type     = use_facet<_Ctype>(__loc) ;
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const _Punct&      __punct      = use_facet<_Punct>(__loc) ;
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const _Punct_intl& __punct_intl = use_facet<_Punct_intl>(__loc) ;
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // some special characters
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  char_type __minus = __c_type.widen('-');
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  char_type __plus  = __c_type.widen('+');
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  char_type __space = __c_type.widen(' ');
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  char_type __zero  = __c_type.widen('0');
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  char_type __point = __intl ? __punct_intl.decimal_point()
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             : __punct.decimal_point();
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  char_type __sep = __intl ? __punct_intl.thousands_sep()
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           : __punct.thousands_sep();
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  string __grouping = __intl ? __punct_intl.grouping()
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             : __punct.grouping();
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int __frac_digits      = __intl ? __punct_intl.frac_digits()
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                  : __punct.frac_digits();
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  string_type __curr_sym = __intl ? __punct_intl.curr_symbol()
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                  : __punct.curr_symbol();
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // if there are no digits we are going to return __s.  If there
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // are digits, but not enough to fill the frac_digits, we are
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // going to add zeros.  I don't know whether this is right or
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // not.
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__digits.empty())
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __s;
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typename string_type::const_iterator __digits_first = __digits.begin();
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typename string_type::const_iterator __digits_last  = __digits.end();
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __is_negative = *__digits_first == __minus;
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__is_negative)
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__digits_first;
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (__BORLANDC__)
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  string_type __sign = __intl ? __is_negative ? __punct_intl.negative_sign()
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                              : __punct_intl.positive_sign()
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              : __is_negative ? __punct.negative_sign()
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                              : __punct.positive_sign();
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  string_type __sign;
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__intl) {
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__is_negative)
3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __sign = __punct_intl.negative_sign();
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __sign = __punct_intl.positive_sign();
3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__is_negative)
3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __sign = __punct.negative_sign();
3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __sign = __punct.positive_sign();
3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__check_digits) {
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typename string_type::const_iterator __cp = __digits_first;
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__cp != __digits_last && __c_type.is(ctype_base::digit, *__cp))
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__cp;
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__cp == __digits_first)
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return __s;
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __digits_last = __cp;
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // If grouping is required, we make a copy of __digits and
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // insert the grouping.
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_BASIC_IOSTRING(char_type) __new_digits;
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!__grouping.empty()) {
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __new_digits.assign(__digits_first, __digits_last);
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __insert_grouping(__new_digits,
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                      __new_digits.size() - __frac_digits,
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                      __grouping,
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                      __sep, __plus, __minus, 0);
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __digits_first = __new_digits.begin(); // <<--
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __digits_last  = __new_digits.end();   // <<--
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Determine the amount of padding required, if any.
4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __width = __str.width();
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG) && (defined(__HP_aCC) && (__HP_aCC <= 1))
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_t __value_length = operator -(__digits_last, __digits_first);
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_t __value_length = __digits_last - __digits_first;
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_t __length = __value_length + __sign.size();
4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__frac_digits != 0)
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__length;
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __generate_curr = (__str.flags() & ios_base::showbase) !=0;
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__generate_curr)
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __length += __curr_sym.size();
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  money_base::pattern __format = __intl ? (__is_negative ? __punct_intl.neg_format()
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                         : __punct_intl.pos_format())
4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                        : (__is_negative ? __punct.neg_format()
4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                         : __punct.pos_format());
4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {
4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //For the moment the following is commented for decoding reason.
4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //No reason to add a space last if the money symbol do not have to be display
4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //if (__format.field[3] == (char) money_base::symbol && !__generate_curr) {
4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //  if (__format.field[2] == (char) money_base::space) {
4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //    __format.field[2] = (char) money_base::none;
4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //  }
4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //}
4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //space can only be second or third and only once (22.2.6.3-1):
4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if ((__format.field[1] == (char) money_base::space) ||
4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        (__format.field[2] == (char) money_base::space))
4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__length;
4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const bool __need_fill = (((sizeof(streamsize) > sizeof(size_t)) && (__STATIC_CAST(streamsize, __length) < __width)) ||
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                            ((sizeof(streamsize) <= sizeof(size_t)) && (__length < __STATIC_CAST(size_t, __width))));
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  streamsize __fill_amt = __need_fill ? __width - __length : 0;
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ios_base::fmtflags __fill_pos = __str.flags() & ios_base::adjustfield;
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__fill_amt != 0 &&
4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      !(__fill_pos & (ios_base::left | ios_base::internal)))
450e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __s = _STLP_PRIV __fill_n(__s, __fill_amt, __fill);
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for (int __i = 0; __i < 4; ++__i) {
4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    char __ffield = __format.field[__i];
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    switch (__ffield) {
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      case money_base::space:
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        *__s++ = __space;
457e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      case money_base::none:
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__fill_amt != 0 && __fill_pos == ios_base::internal)
459e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          __s = _STLP_PRIV __fill_n(__s, __fill_amt, __fill);
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      case money_base::symbol:
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__generate_curr)
463e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          __s = _STLP_STD::copy(__curr_sym.begin(), __curr_sym.end(), __s);
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      case money_base::sign:
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (!__sign.empty())
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          *__s++ = __sign[0];
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      case money_base::value:
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__frac_digits == 0) {
471e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          __s = _STLP_STD::copy(__digits_first, __digits_last, __s);
4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        } else {
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          if ((int)__value_length <= __frac_digits) {
4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            // if we see '9' here, we should out 0.09
4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            *__s++ = __zero;  // integer part is zero
4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            *__s++ = __point; // decimal point
477e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            __s =  _STLP_PRIV __fill_n(__s, __frac_digits - __value_length, __zero); // zeros
478e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            __s = _STLP_STD::copy(__digits_first, __digits_last, __s); // digits
4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          } else {
480e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            __s = _STLP_STD::copy(__digits_first, __digits_last - __frac_digits, __s);
4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            if (__frac_digits != 0) {
4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block              *__s++ = __point;
483e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott              __s = _STLP_STD::copy(__digits_last - __frac_digits, __digits_last, __s);
4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            }
4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          }
4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
4879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        break;
4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } //Close for switch
4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  } // Close for loop
4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Ouput rest of sign if necessary.
4929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__sign.size() > 1)
493e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __s = _STLP_STD::copy(__sign.begin() + 1, __sign.end(), __s);
4949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__fill_amt != 0 &&
4959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      !(__fill_pos & (ios_base::right | ios_base::internal)))
496e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __s = _STLP_PRIV __fill_n(__s, __fill_amt, __fill);
4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __s;
4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _OutputIter>
5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_OutputIter
5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockmoney_put<_CharT, _OutputIter>
5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::do_put(_OutputIter __s, bool __intl, ios_base& __str,
5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          char_type __fill, _STLP_LONGEST_FLOAT_TYPE __units) const {
5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_BASIC_IOSTRING(char_type) __digits;
5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __get_money_digits(__digits, __str, __units);
5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return _STLP_PRIV __money_do_put(__s, __intl, __str, __fill, __digits, false, __STATIC_CAST(string_type*, 0));
5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _OutputIter>
5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_OutputIter
5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockmoney_put<_CharT, _OutputIter>
5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::do_put(_OutputIter __s, bool __intl, ios_base& __str,
5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          char_type __fill, const string_type& __digits) const {
5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return _STLP_PRIV __money_do_put(__s, __intl, __str, __fill, __digits, true, __STATIC_CAST(string_type*, 0));
5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
5229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MONETARY_C */
5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
528