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