bool _STLP_CALL __read_float(__iostring& __buf, _InputIter& __in_ite, _InputIter& __end, ios_base& __s, _CharT*) { // Create a string, copying characters of the form // [+-]? [0-9]* .? [0-9]* ([eE] [+-]? [0-9]+)? bool __digits_before_dot /* = false */; bool __digits_after_dot = false; bool __ok; bool __grouping_ok = true; const ctype<_CharT>& __ct = *__STATIC_CAST(const ctype<_CharT>*, __s._M_ctype_facet()); const numpunct<_CharT>& __numpunct = *__STATIC_CAST(const numpunct<_CharT>*, __s._M_numpunct_facet()); const string& __grouping = __s._M_grouping(); // cached copy _CharT __dot = __numpunct.decimal_point(); _CharT __sep = __numpunct.thousands_sep(); _CharT __digits[10]; _CharT __xplus; _CharT __xminus; _CharT __pow_e; _CharT __pow_E; _Initialize_get_float(__ct, __xplus, __xminus, __pow_e, __pow_E, __digits); // Get an optional sign __in_ite = __copy_sign(__in_ite, __end, __buf, __xplus, __xminus); // Get an optional string of digits. if (!__grouping.empty()) __digits_before_dot = __copy_grouped_digits(__in_ite, __end, __buf, __digits, __sep, __grouping, __grouping_ok); else __digits_before_dot = __copy_digits(__in_ite, __end, __buf, __digits); // Get an optional decimal point, and an optional string of digits. if (__in_ite != __end && *__in_ite == __dot) { __buf.push_back('.'); ++__in_ite; __digits_after_dot = __copy_digits(__in_ite, __end, __buf, __digits); } // There have to be some digits, somewhere. __ok = __digits_before_dot || __digits_after_dot; // Get an optional exponent. if (__ok && __in_ite != __end && (*__in_ite == __pow_e || *__in_ite == __pow_E)) { __buf.push_back('e'); ++__in_ite; __in_ite = __copy_sign(__in_ite, __end, __buf, __xplus, __xminus); __ok = __copy_digits(__in_ite, __end, __buf, __digits); // If we have an exponent then the sign // is optional but the digits aren't. } return __ok; }
bool _STLP_CALL __copy_grouped_digits(_InputIter& __first, _InputIter __last, __iostring& __v, const _CharT * __digits, _CharT __sep, const string& __grouping, bool& __grouping_ok) { bool __ok = false; char __group_sizes[64]; char*__group_sizes_end = __group_sizes; char __current_group_size = 0; for ( ; __first != __last; ++__first) { _CharT __c = *__first; bool __tmp = __get_fdigit_or_sep(__c, __sep, __digits); if (__tmp) { if (__c == ',') { *__group_sizes_end++ = __current_group_size; __current_group_size = 0; } else { __ok = true; __v.push_back((char)__c); ++__current_group_size; } } else break; } if (__group_sizes_end != __group_sizes) *__group_sizes_end++ = __current_group_size; __grouping_ok = __valid_grouping(__group_sizes, __group_sizes_end, __grouping.data(), __grouping.data() + __grouping.size()); return __ok; }
_InputIter _STLP_CALL __copy_sign(_InputIter __first, _InputIter __last, __iostring& __v, _CharT __xplus, _CharT __xminus) { if (__first != __last) { _CharT __c = *__first; if (__c == __xplus) ++__first; else if (__c == __xminus) { __v.push_back('-'); ++__first; } } return __first; }
bool _STLP_CALL __copy_digits(_InputIter& __first, _InputIter __last, __iostring& __v, const _CharT* __digits) { bool __ok = false; for ( ; __first != __last; ++__first) { _CharT __c = *__first; if (__get_fdigit(__c, __digits)) { __v.push_back((char)__c); __ok = true; } else break; } return __ok; }