_InputIter num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __s, ios_base::iostate& __err, bool& __x) const { if (__s.flags() & ios_base::boolalpha) { locale __loc = __s.getloc(); const _Numpunct& __np = *(const _Numpunct*)__s._M_numpunct_facet(); // const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc) ; // const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__loc) ; const basic_string<_CharT> __truename = __np.truename(); const basic_string<_CharT> __falsename = __np.falsename(); bool __true_ok = true; bool __false_ok = true; size_t __n = 0; for ( ; __in != __end; ++__in) { _CharT __c = *__in; __true_ok = __true_ok && (__c == __truename[__n]); __false_ok = __false_ok && (__c == __falsename[__n]); ++__n; if ((!__true_ok && !__false_ok) || (__true_ok && __n >= __truename.size()) || (__false_ok && __n >= __falsename.size())) { ++__in; break; } } if (__true_ok && __n < __truename.size()) __true_ok = false; if (__false_ok && __n < __falsename.size()) __false_ok = false; if (__true_ok || __false_ok) { __err = ios_base::goodbit; __x = __true_ok; } else __err = ios_base::failbit; if (__in == __end) __err |= ios_base::eofbit; return __in; } else { long __lx; _InputIter __tmp = this->do_get(__in, __end, __s, __err, __lx); if (!(__err & ios_base::failbit)) { if (__lx == 0) __x = false; else if (__lx == 1) __x = true; else __err |= ios_base::failbit; } return __tmp; } }
num_put<Pt::Char, ostreambuf_iterator<Pt::Char> >::iter_type num_put<Pt::Char, ostreambuf_iterator<Pt::Char> >::do_put(iter_type s, ios_base& f, char_type fill, bool val) const { if( 0 == (f.flags() & ios_base::boolalpha) ) return do_put(s, f, fill, static_cast<long>(val)); typedef Pt::Char char_type; const numpunct<char_type>& np = use_facet< numpunct<char_type> >( f.getloc() ); Pt::String str = val ? np.truename() : np.falsename(); streamsize width = f.width(0); if( str.size() >= static_cast<std::size_t>(width) ) { return std::copy(str.begin(), str.end(), s); } streamsize pad = width - str.size(); ios_base::fmtflags dir = f.flags() & ios_base::adjustfield; if (dir == ios_base::left) { std::copy(str.begin(), str.end(), s); std::fill_n(s, pad, fill); return s; } // right/internal padding std::fill_n(s, pad, fill); return std::copy(str.begin(), str.end(), s); }
_InputIter _STLP_CALL __do_get_integer(_InputIter& __in_ite, _InputIter& __end, ios_base& __str, ios_base::iostate& __err, _Integer& __val, _CharT* /*__pc*/) { locale __loc = __str.getloc(); const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc); #if defined (__HP_aCC) && (__HP_aCC == 1) bool _IsSigned = !((_Integer)(-1) > 0); #else typedef typename is_signed<_Integer>::type::type _IsSigned; #endif const int __base_or_zero = __get_base_or_zero(__in_ite, __end, __str.flags(), __ctype); int __got = __base_or_zero & 1; bool __result; if (__in_ite == __end) { // We may have already read a 0. If so, if (__got > 0) { // the result is 0 even if we're at eof. __val = 0; __result = true; } else __result = false; } else { const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc); const bool __negative = (__base_or_zero & 2) != 0; const int __base = __base_or_zero >> 2; #if defined (__HP_aCC) && (__HP_aCC == 1) if (_IsSigned) __result = __get_integer(__in_ite, __end, __base, __val, __got, __negative, __np.thousands_sep(), __np.grouping(), __true_type() ); else __result = __get_integer(__in_ite, __end, __base, __val, __got, __negative, __np.thousands_sep(), __np.grouping(), __false_type() ); #else __result = __get_integer(__in_ite, __end, __base, __val, __got, __negative, __np.thousands_sep(), __np.grouping(), _IsSigned()); # endif } __err = __STATIC_CAST(ios_base::iostate, __result ? ios_base::goodbit : ios_base::failbit); if (__in_ite == __end) __err |= ios_base::eofbit; return __in_ite; }
_InputIter num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __s, ios_base::iostate& __err, bool& __x) const { if (__s.flags() & ios_base::boolalpha) { locale __loc = __s.getloc(); const _Numpunct& __np = *__STATIC_CAST(const _Numpunct*, __s._M_numpunct_facet()); // const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc) ; // const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__loc) ; const basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > __truename = __np.truename(); const basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > __falsename = __np.falsename(); bool __true_ok = true; bool __false_ok = true; size_t __n = 0; for ( ; __in_ite != __end; ++__in_ite) { _CharT __c = *__in_ite; __true_ok = __true_ok && (__c == __truename[__n]); __false_ok = __false_ok && (__c == __falsename[__n]); ++__n; if ((!__true_ok && !__false_ok) || (__true_ok && __n >= __truename.size()) || (__false_ok && __n >= __falsename.size())) { ++__in_ite; break; } } if (__true_ok && __n < __truename.size()) __true_ok = false; if (__false_ok && __n < __falsename.size()) __false_ok = false; if (__true_ok || __false_ok) { __err = ios_base::goodbit; __x = __true_ok; } else __err = ios_base::failbit; if (__in_ite == __end) __err |= ios_base::eofbit; return __in_ite; }
_InputIter _STLP_CALL __do_get_float(_InputIter& __in_ite, _InputIter& __end, ios_base& __str, ios_base::iostate& __err, _Float& __val, _CharT* /*__pc*/) { locale __loc = __str.getloc(); const ctype<_CharT> &__ctype = use_facet<ctype<_CharT> >(__loc); const numpunct<_CharT> &__numpunct = use_facet<numpunct<_CharT> >(__loc); __iostring __buf ; bool __ok = __read_float(__buf, __in_ite, __end, __ctype, __numpunct); if (__ok) { __string_to_float(__buf, __val); __err = ios_base::goodbit; } else { __err = ios_base::failbit; } if (__in_ite == __end) __err |= ios_base::eofbit; return __in_ite; }
_InputIter _STLP_CALL __do_get_alphabool(_InputIter& __in_ite, _InputIter& __end, ios_base& __str, ios_base::iostate& __err, bool& __x, _CharT* /*__pc*/) { const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__str.getloc()); const basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > __truename = __np.truename(); const basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > __falsename = __np.falsename(); bool __true_ok = true; bool __false_ok = true; size_t __n = 0; for ( ; __in_ite != __end; ++__in_ite) { _CharT __c = *__in_ite; __true_ok = __true_ok && (__c == __truename[__n]); __false_ok = __false_ok && (__c == __falsename[__n]); ++__n; if ((!__true_ok && !__false_ok) || (__true_ok && __n >= __truename.size()) || (__false_ok && __n >= __falsename.size())) { ++__in_ite; break; } } if (__true_ok && __n < __truename.size()) __true_ok = false; if (__false_ok && __n < __falsename.size()) __false_ok = false; if (__true_ok || __false_ok) { __err = ios_base::goodbit; __x = __true_ok; } else __err = ios_base::failbit; if (__in_ite == __end) __err |= ios_base::eofbit; return __in_ite; }
string::const_iterator _STLP_CALL __get_formatted_time _STLP_WEAK (_InIt1 __first, _InIt1 __last, string::const_iterator __format, string::const_iterator __format_end, _Ch*, const _TimeInfo& __table, const ios_base& __s, ios_base::iostate& __err, tm* __t) { const ctype<_Ch>& __ct = use_facet<ctype<_Ch> >(__s.getloc()); typedef basic_string<_Ch, char_traits<_Ch>, allocator<_Ch> > string_type; size_t offset; while (__first != __last && __format != __format_end) { offset = 0; if (*__format == '%') { ++__format; char __c = *__format; if (__c == '#') { //MS extension ++__format; __c = *__format; } switch (__c) { case 'A': offset = 7; case 'a': { size_t __index = __match(__first, __last, __table._M_dayname + offset, __table._M_dayname + offset + 7); if (__index == 7) return __format; __t->tm_wday = __STATIC_CAST(int, __index); break; } case 'B': offset = 12; case 'b': { size_t __index = __match(__first, __last, __table._M_monthname + offset, __table._M_monthname + offset + 12); if (__index == 12) return __format; __t->tm_mon = __STATIC_CAST(int, __index); break; } case 'd': { bool __pr = __get_decimal_integer(__first, __last, __t->tm_mday, __STATIC_CAST(_Ch*, 0)); if (!__pr || __t->tm_mday < 1 || __t->tm_mday > 31) { __err |= ios_base::failbit; return __format; } break; } case 'H': case 'I': { bool __pr = __get_decimal_integer(__first, __last, __t->tm_hour, __STATIC_CAST(_Ch*, 0)); if (!__pr) return __format; break; } case 'j': { bool __pr = __get_decimal_integer(__first, __last, __t->tm_yday, __STATIC_CAST(_Ch*, 0)); if (!__pr) return __format; break; } case 'm': { bool __pr = __get_decimal_integer(__first, __last, __t->tm_mon, __STATIC_CAST(_Ch*, 0)); --__t->tm_mon; if (!__pr || __t->tm_mon < 0 || __t->tm_mon > 11) { __err |= ios_base::failbit; return __format; } break; } case 'M': { bool __pr = __get_decimal_integer(__first, __last, __t->tm_min, __STATIC_CAST(_Ch*, 0)); if (!__pr) return __format; break; } case 'p': { size_t __index = __match(__first, __last, __table._M_am_pm + 0, __table._M_am_pm + 2); if (__index == 2) return __format; // 12:00 PM <=> 12:00, 12:00 AM <=> 00:00 if (__index == 1 && __t->tm_hour != 12 ) __t->tm_hour += 12; if (__index == 0 && __t->tm_hour == 12 ) __t->tm_hour = 0; break; } case 'S': { bool __pr = __get_decimal_integer(__first, __last, __t->tm_sec, __STATIC_CAST(_Ch*, 0)); if (!__pr) return __format; break; } case 'y': { bool __pr = __get_decimal_integer(__first, __last, __t->tm_year, __STATIC_CAST(_Ch*, 0)); if (!__pr) return __format; break; } case 'Y': { bool __pr = __get_decimal_integer(__first, __last, __t->tm_year, __STATIC_CAST(_Ch*, 0)); __t->tm_year -= 1900; if (!__pr) return __format; break; } default: break; } } else { if (*__first++ != __ct.widen(*__format)) break;
num_get< Pt::Char, istreambuf_iterator<Pt::Char> >::iter_type num_get< Pt::Char, istreambuf_iterator<Pt::Char> >::do_get(iter_type it, iter_type end, ios_base& stream, ios_base::iostate& state, bool& val) const { if(stream.flags() & ios_base::boolalpha) { const numpunct<Pt::Char>& np = use_facet< numpunct<Pt::Char> >(stream.getloc()); const Pt::String truename = np.truename(); const Pt::String falsename = np.falsename(); bool true_ok = true; bool false_ok = true; std::size_t n = 0; for ( ; it != end; ++it) { Pt::Char c = *it; true_ok = true_ok && (n < truename.size()) && (c == truename[n]); false_ok = false_ok && (n < falsename.size()) && (c == falsename[n]); ++n; if( (! true_ok && ! false_ok) || (true_ok && n >= truename.size()) || (false_ok && n >= falsename.size()) ) { ++it; break; } } if (true_ok && n < truename.size()) true_ok = false; if (false_ok && n < falsename.size()) false_ok = false; if (true_ok || false_ok) { state = ios_base::goodbit; val = true_ok; } else state = ios_base::failbit; if (it == end) state |= ios_base::eofbit; } else { long l = 3; it = this->do_get(it, end, stream, state, l); if( 0 == (state & ios_base::failbit) ) { if (l == 0) val = false; else if (l == 1) val = true; else state |= ios_base::failbit; } } return it; }
_OutputIter _S_do_put(_OutputIter __s, bool __intl, ios_base& __str, _CharT __fill, const _Str& __digits, bool __check_digits, _Str_Type * /*__dummy*/) { typedef _CharT char_type; typedef _Str_Type string_type; typedef ctype<char_type> _Ctype; typedef moneypunct<char_type, false> _Punct; typedef moneypunct<char_type, true> _Punct_intl; locale __loc = __str.getloc(); const _Ctype& __c_type = use_facet<_Ctype>(__loc) ; const _Punct& __punct = use_facet<_Punct>(__loc) ; const _Punct_intl& __punct_intl = use_facet<_Punct_intl>(__loc) ; // some special characters char_type __minus = __c_type.widen('-'); char_type __plus = __c_type.widen('+'); char_type __space = __c_type.widen(' '); char_type __zero = __c_type.widen('0'); char_type __point = __intl ? __punct_intl.decimal_point() : __punct.decimal_point(); char_type __sep = __intl ? __punct_intl.thousands_sep() : __punct.thousands_sep(); string __grouping = __intl ? __punct_intl.grouping() : __punct.grouping(); int __frac_digits = __intl ? __punct_intl.frac_digits() : __punct.frac_digits(); string_type __curr_sym = __intl ? __punct_intl.curr_symbol() : __punct.curr_symbol(); // if there are no digits we are going to return __s. If there // are digits, but not enough to fill the frac_digits, we are // going to add zeros. I don't know whether this is right or // not. if (__digits.empty()) return __s; typename string_type::const_iterator __digits_first = __digits.begin(); typename string_type::const_iterator __digits_last = __digits.end(); bool __is_negative = *__digits_first == __minus; if (__is_negative) ++__digits_first; string_type __sign = __intl ? __is_negative ? __punct_intl.negative_sign() : __punct_intl.positive_sign() : __is_negative ? __punct.negative_sign() : __punct.positive_sign(); if (__check_digits) { typename string_type::const_iterator __cp = __digits_first; while (__cp != __digits_last && __c_type.is(ctype_base::digit, *__cp)) ++__cp; if (__cp == __digits_first) return __s; __digits_last = __cp; } // If grouping is required, we make a copy of __digits and // insert the grouping. _STLP_BASIC_IOSTRING(char_type) __new_digits; if (!__grouping.empty()) { __new_digits.assign(__digits_first, __digits_last); __insert_grouping(__new_digits, __new_digits.size() - __frac_digits, __grouping, __sep, __plus, __minus, 0); __digits_first = __new_digits.begin(); // <<-- __digits_last = __new_digits.end(); // <<-- } // Determine the amount of padding required, if any. streamsize __width = __str.width(); #if defined(_STLP_DEBUG) && (defined(__HP_aCC) && (__HP_aCC <= 1)) size_t __value_length = operator -(__digits_last, __digits_first); #else size_t __value_length = __digits_last - __digits_first; #endif size_t __length = __value_length + __sign.size(); if (__frac_digits != 0) ++__length; bool __generate_curr = (__str.flags() & ios_base::showbase) !=0; if (__generate_curr) __length += __curr_sym.size(); money_base::pattern __format = __intl ? (__is_negative ? __punct_intl.neg_format() : __punct_intl.pos_format()) : (__is_negative ? __punct.neg_format() : __punct.pos_format()); { //For the moment the following is commented for decoding reason. //No reason to add a space last if the money symbol do not have to be display //if (__format.field[3] == (char) money_base::symbol && !__generate_curr) { // if (__format.field[2] == (char) money_base::space) { // __format.field[2] = (char) money_base::none; // } //} //space can only be second or third and only once (22.2.6.3-1): if ((__format.field[1] == (char) money_base::space) || (__format.field[2] == (char) money_base::space)) ++__length; } const bool __need_fill = (((sizeof(streamsize) > sizeof(size_t)) && (__STATIC_CAST(streamsize, __length) < __width)) || ((sizeof(streamsize) <= sizeof(size_t)) && (__length < __STATIC_CAST(size_t, __width)))); streamsize __fill_amt = __need_fill ? __width - __length : 0; ios_base::fmtflags __fill_pos = __str.flags() & ios_base::adjustfield; if (__fill_amt != 0 && !(__fill_pos & (ios_base::left | ios_base::internal))) __s = __fill_n(__s, __fill_amt, __fill); for (int __i = 0; __i < 4; ++__i) { char __ffield = __format.field[__i]; switch (__ffield) { case money_base::none: if (__fill_amt != 0 && __fill_pos == ios_base::internal) __s = __fill_n(__s, __fill_amt, __fill); break; case money_base::space: *__s++ = __space; if (__fill_amt != 0 && __fill_pos == ios_base::internal) __s = __fill_n(__s, __fill_amt, __fill); break; case money_base::symbol: if (__generate_curr) __s = copy(__curr_sym.begin(), __curr_sym.end(), __s); break; case money_base::sign: if (!__sign.empty()) *__s++ = __sign[0]; break; case money_base::value: if (__frac_digits == 0) __s = copy(__digits_first, __digits_last, __s); else { if ((int)__value_length <= __frac_digits) { *__s++ = __point; __s = copy(__digits_first, __digits_last, __s); __s = __fill_n(__s, __frac_digits - __value_length, __zero); } else { __s = copy(__digits_first, __digits_last - __frac_digits, __s); if (__frac_digits != 0) { *__s++ = __point; __s = copy(__digits_last - __frac_digits, __digits_last, __s); } } } } //Close for switch } // Close for loop // Ouput rest of sign if necessary. if (__sign.size() > 1) __s = copy(__sign.begin() + 1, __sign.end(), __s); if (__fill_amt != 0 && !(__fill_pos & (ios_base::right | ios_base::internal))) __s = __fill_n(__s, __fill_amt, __fill); return __s; }
_InputIter _S_do_get(_InputIter __s, _InputIter __end, bool __intl, ios_base& __str, ios_base::iostate& __err, _StrType& __digits, bool &__is_positive, _CharT* /*__dummy*/) { if (__s == __end) { __err |= ios_base::eofbit; return __s; } typedef _CharT char_type; typedef _StrType string_type; typedef _InputIter iter_type; typedef moneypunct<char_type, false> _Punct; typedef moneypunct<char_type, true> _Punct_intl; typedef ctype<char_type> _Ctype; locale __loc = __str.getloc(); const _Punct& __punct = use_facet<_Punct>(__loc) ; const _Punct_intl& __punct_intl = use_facet<_Punct_intl>(__loc) ; const _Ctype& __c_type = use_facet<_Ctype>(__loc) ; money_base::pattern __format = __intl ? __punct_intl.neg_format() : __punct.neg_format(); string_type __ns = __intl ? __punct_intl.negative_sign() : __punct.negative_sign(); string_type __ps = __intl ? __punct_intl.positive_sign() : __punct.positive_sign(); int __i; bool __symbol_required = (__str.flags() & ios_base::showbase) != 0; string_type __buf; back_insert_iterator<string_type> __out_ite(__buf); for (__i = 0; __i < 4; ++__i) { switch (__format.field[__i]) { case money_base::none: if (__i == 3) { if (__c_type.is(ctype_base::space, *__s)) { __err = ios_base::failbit; return __s; } break; } while (__s != __end && __c_type.is(ctype_base::space, *__s)) ++__s; break; case money_base::space: if (!__c_type.is(ctype_base::space, *__s)) { __err = ios_base::failbit; return __s; } ++__s; while (__s != __end && __c_type.is(ctype_base::space, *__s)) ++__s; break; case money_base::symbol: { string_type __curs = __intl ? __punct_intl.curr_symbol() : __punct.curr_symbol(); pair<iter_type, bool> __result = __get_string(__s, __end, __curs.begin(), __curs.end()); if (!__result.second && __symbol_required) __err = ios_base::failbit; __s = __result.first; break; } case money_base::sign: { if (__s == __end) { if (__ps.empty()) break; if (__ns.empty()) { __is_positive = false; break; } __err = ios_base::failbit; return __s; } else { if (__ps.empty()) { if (__ns.empty()) break; if (*__s == __ns[0]) { ++__s; __is_positive = false; } break; } else { if (*__s == __ps[0]) { ++__s; break; } if (__ns.empty()) break; if (*__s == __ns[0]) { ++__s; __is_positive = false; break; } __err = ios_base::failbit; } } return __s; } case money_base::value: { char_type __point = __intl ? __punct_intl.decimal_point() : __punct.decimal_point(); int __frac_digits = __intl ? __punct_intl.frac_digits() : __punct.frac_digits(); string __grouping = __intl ? __punct_intl.grouping() : __punct.grouping(); bool __syntax_ok = true; bool __result; char_type __sep = __grouping.empty() ? char_type() : __intl ? __punct_intl.thousands_sep() : __punct.thousands_sep(); __result = __get_monetary_value(__s, __end, __out_ite, __c_type, __point, __frac_digits, __sep, __grouping, __syntax_ok); if (!__syntax_ok) __err |= ios_base::failbit; if (!__result) { __err = ios_base::failbit; return __s; } break; } // Close money_base::value case } // Close switch statement } // Close for loop if (__is_positive) { if (__ps.size() > 1) { pair<_InputIter, bool> __result = __get_string(__s, __end, __ps.begin() + 1, __ps.end()); __s = __result.first; if (!__result.second) __err |= ios::failbit; } if (!(__err & ios_base::failbit)) __digits = __buf; } else { if (__ns.size() > 1) { pair<_InputIter, bool> __result = __get_string(__s, __end, __ns.begin() + 1, __ns.end()); __s = __result.first; if (!__result.second) __err |= ios::failbit; } if (!(__err & ios::failbit)) { __digits = __c_type.widen('-'); __digits += __buf; } } if (__s == __end) __err |= ios::eofbit; return __s; }