38__rw_get_num (
void*,
const char*,
int,
int,
39 const char*, _RWSTD_SIZE_T,
const char*, _RWSTD_SIZE_T);
42__rw_check_grouping (
const char*, _RWSTD_SIZE_T,
43 const char*, _RWSTD_SIZE_T);
51template <
class _CharT,
class _InputIter>
52_RW::__rw_facet_id money_get<_CharT, _InputIter>::id;
55template <
class _CharT,
class _InputIter>
56typename money_get<_CharT, _InputIter>::iter_type
57money_get<_CharT, _InputIter>::
58_C_get (iter_type __it, iter_type __end,
bool __intl, ios_base &__flags,
61 typedef moneypunct<_CharT, false> _Punct0;
62 typedef moneypunct<_CharT, true> _Punct1;
64 const _Punct0 &__pun = __intl ?
72 const string_type __ps = __pun.positive_sign ();
73 const string_type __ns = __pun.negative_sign ();
74 const string_type __cs = __pun.curr_symbol ();
75 const string __gr = __pun.grouping ();
76 const money_base::pattern __pat = __pun.neg_format ();
80 bool __needws =
false;
81 bool __seendp =
false;
83 const ctype<_CharT> &__ctp =
89 typedef typename string_type::traits_type _Traits;
91 char __grpbuf [
sizeof __buf];
92 char *__pgrp = __grpbuf;
93 const char *__grpstart = 0;
94 const char *__grpend = 0;
103 const int __fl = __flags.flags ();
105 typedef _RWSTD_SIZE_T _SizeT;
107 for (_SizeT __i = 0; !__ebits && __i !=
sizeof __pat.field; ++__i) {
109 switch (__pat.field [__i]) {
111 case money_base::space:
115 case money_base::none: {
119 if (
sizeof __pat.field == __i + 1
120 || 2 == __i && money_base::symbol == __pat.field [3]
121 && (!(__fl & _RW::__rw_showbase) || 0 == __cs.size ())
122 && !( __sign < 0 && __ns.size () > 1
123 || __sign > 0 && __ps.size () > 1)
124 || 1 == __i && money_base::value == __pat.field [0]
125 && 0 == __ns.size () && 0 == __ps.size ()
126 && (0 == __cs.size () || !(__fl & _RW::__rw_showbase)))
131 while (__it != __end && __ctp.is (ctype_base::space, *__it)) {
136 if (__needws && !__nc)
137 __ebits |= _RW::__rw_failbit;
141 case money_base::symbol: {
147 if ( __fl & _RW::__rw_showbase
149 || 2 == __i && (money_base::none != __pat.field [3])
150 || __sign < 0 && __ns.size () > 1
151 || __sign > 0 && __ps.size () > 1) {
153 for (_SizeT __nc = 0; __nc != __cs.size ();
155 if (__it == __end || !_Traits::eq (*__it, __cs [__nc])) {
159 if (__nc || __fl & _RW::__rw_showbase)
160 __ebits |= _RW::__rw_failbit;
168 case money_base::sign: {
171 if (__ps.size () && __ns.size ())
172 __ebits |= _RW::__rw_failbit;
174 __sign = __ps.empty () - 1;
178 const char_type __c = *__it;
183 if (__ps.size () && _Traits::eq (__c, __ps [0])) {
187 else if (__ns.size () && _Traits::eq (__c, __ns [0])) {
195 case money_base::value: {
197 const char_type __ts =
198 __gr.size () && __gr [0] && __gr [0] != _RWSTD_CHAR_MAX ?
199 __pun.thousands_sep () : __ctp.widen (
'0');
201 int __fd = __pun.frac_digits ();
203 for (; __it != __end; ++__it) {
208 const char_type __c = *__it;
209 const char __ch = __ctp.narrow (__c,
'\0');
211 if (__ch >=
'0' && __ch <=
'9') {
212 if (!__seendp || __fd-- > 0)
215 else if ( !__seendp && __fd > 0
216 && _Traits::eq (__c, __pun.decimal_point ())) {
220 else if (!__seendp && _Traits::eq (__c, __ts)) {
223 _RWSTD_PTRDIFF_T __len;
226 __len = __pcur - __grpstart;
229 __len = __pcur - __buf - 1;
232 typedef unsigned char _UChar;
234 *__pgrp++ = char (__len < _UChar (-1) ? __len : -1);
241 if (__pcur - __buf > 1) {
253 __ebits = _RW::__rw_failbit;
259 if (!(__ebits & _RW::__rw_failbit)) {
264 const _SizeT __sizes [] = {
265 __ps.size () ? __ps.size () -1 : 0,
266 __ns.size () ? __ns.size () -1 : 0
269 const char_type*
const __names [] = {
270 __ps.data () + !!__sizes [0],
271 __ns.data () + !!__sizes [1]
274 if (__sign && (__sizes [0] || __sizes [1])) {
283 __it = _RW::__rw_match_name (__it, __end, __names, __sizes,
284 sizeof __names /
sizeof *__names,
287 if (1 < __inx && __sizes [__sign < 0]) {
293 __ebits = _RW::__rw_failbit;
296 else if (!_Traits::eq (*__ps.data (), *__ns.data ())) {
304 __inx = 0 < __sizes [__sign < 0];
308 *__buf = __inx ?
'-' :
'+';
309 __sign = -int (__inx);
312 else if (__sign < 0) {
316 if (__pstr && !(__ebits & _RW::__rw_failbit)) {
318 const char *__start = __buf + 1;
319 for (;
'0' == *__start &&
'0' == __start [1]; ++__start);
326 __pstr->resize ((__pcur - __start) + _SizeT (__sign));
329 _Traits::assign ((*__pstr)[0], __ctp.widen (
'-'));
331 __ctp.widen (__start, __pcur, &(*__pstr)[_SizeT (__sign)]);
334 const char *__grs =
"";
342 const _RWSTD_PTRDIFF_T __len =
343 (__grpend ? __grpend : __pcur) - __grpstart;
345 typedef unsigned char _UChar;
347 *__pgrp++ = char (__len < _UChar (-1) ? __len : -1);
349 __grs = __gr.data ();
350 __grn = __gr.size ();
358 _RW::__rw_get_num (__pval, __buf, _C_ldouble, 0,
359 __grpbuf, __pgrp - __grpbuf,
364 else if (0 > _RW::__rw_check_grouping (__grpbuf, __pgrp - __grpbuf,
366 __ebits |= _RW::__rw_failbit;
369 __ebits |= _RW::__rw_failbit;
373 __ebits |= _RW::__rw_eofbit;
#define _RWSTD_USE_FACET(type, arg)
#define _RWSTD_REINTERPRET_CAST(T, x)
#define _RWSTD_NAMESPACE(name)