williamr@2: /* williamr@4: * Portions Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. williamr@4: * williamr@2: * Copyright (c) 1999 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@2: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: #ifndef _STLP_NUM_GET_C williamr@2: #define _STLP_NUM_GET_C williamr@2: williamr@2: #ifndef _STLP_INTERNAL_NUM_GET_H williamr@4: # include williamr@2: #endif williamr@2: williamr@4: #ifndef _STLP_INTERNAL_LIMITS williamr@4: # include williamr@2: #endif williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@4: _STLP_MOVE_TO_PRIV_NAMESPACE williamr@4: williamr@4: _STLP_DECLSPEC unsigned char _STLP_CALL __digit_val_table(unsigned); williamr@4: _STLP_DECLSPEC const char* _STLP_CALL __narrow_atoms(); williamr@2: williamr@2: template < class _InputIter, class _Integer, class _CharT> williamr@2: _InputIter _STLP_CALL williamr@4: __do_get_integer(_InputIter&, _InputIter&, ios_base&, ios_base::iostate&, _Integer&, _CharT*); williamr@2: williamr@4: // __do_get_integer and its helper functions. williamr@2: williamr@4: inline bool _STLP_CALL __get_fdigit(char __c, const char*) williamr@4: { return __c >= '0' && __c <= '9'; } williamr@2: williamr@4: inline bool _STLP_CALL __get_fdigit_or_sep(char& __c, char __sep, const char *__digits) { williamr@2: if (__c == __sep) { williamr@2: __c = ',' ; williamr@2: return true ; williamr@4: } williamr@4: else williamr@4: return __get_fdigit(__c, __digits); williamr@2: } williamr@2: williamr@2: inline int _STLP_CALL williamr@2: __get_digit_from_table(unsigned __index) williamr@4: { return (__index > 127 ? 0xFF : __digit_val_table(__index)); } williamr@2: williamr@2: template williamr@2: int williamr@4: __get_base_or_zero(_InputIter& __in_ite, _InputIter& __end, ios_base& __str, _CharT*) { williamr@2: _CharT __atoms[5]; williamr@4: const ctype<_CharT>& __c_type = *__STATIC_CAST(const ctype<_CharT>*, __str._M_ctype_facet()); williamr@2: williamr@4: __c_type.widen(__narrow_atoms(), __narrow_atoms() + 5, __atoms); williamr@2: williamr@2: bool __negative = false; williamr@4: _CharT __c = *__in_ite; williamr@2: williamr@2: if (__c == __atoms[1] /* __xminus_char */ ) { williamr@2: __negative = true; williamr@4: ++__in_ite; williamr@2: } williamr@2: else if (__c == __atoms[0] /* __xplus_char */ ) williamr@4: ++__in_ite; williamr@2: williamr@2: int __base; williamr@2: int __valid_zero = 0; williamr@2: williamr@2: ios_base::fmtflags __basefield = __str.flags() & ios_base::basefield; williamr@2: williamr@2: switch (__basefield) { williamr@2: case ios_base::oct: williamr@2: __base = 8; williamr@2: break; williamr@2: case ios_base::dec: williamr@2: __base = 10; williamr@2: break; williamr@2: case ios_base::hex: williamr@2: __base = 16; williamr@4: if (__in_ite != __end && *__in_ite == __atoms[2] /* __zero_char */ ) { williamr@4: ++__in_ite; williamr@4: if (__in_ite != __end && williamr@4: (*__in_ite == __atoms[3] /* __x_char */ || *__in_ite == __atoms[4] /* __X_char */ )) williamr@4: ++__in_ite; williamr@2: else williamr@2: __valid_zero = 1; // That zero is valid by itself. williamr@2: } williamr@2: break; williamr@2: default: williamr@4: if (__in_ite != __end && *__in_ite == __atoms[2] /* __zero_char */ ) { williamr@4: ++__in_ite; williamr@4: if (__in_ite != __end && williamr@4: (*__in_ite == __atoms[3] /* __x_char */ || *__in_ite == __atoms[4] /* __X_char */ )) { williamr@4: ++__in_ite; williamr@2: __base = 16; williamr@2: } williamr@2: else williamr@2: { williamr@2: __base = 8; williamr@2: __valid_zero = 1; // That zero is still valid by itself. williamr@2: } williamr@2: } williamr@2: else williamr@2: __base = 10; williamr@2: break; williamr@2: } williamr@2: return (__base << 2) | ((int)__negative << 1) | __valid_zero; williamr@2: } williamr@2: williamr@2: williamr@4: template williamr@2: bool _STLP_CALL williamr@2: __get_integer(_InputIter& __first, _InputIter& __last, williamr@4: int __base, _Integer& __val, williamr@4: int __got, bool __is_negative, _CharT __separator, const string& __grouping, const __true_type& /*_IsSigned*/) { williamr@2: bool __ovflow = false; williamr@2: _Integer __result = 0; williamr@2: bool __is_group = !__grouping.empty(); williamr@4: char __group_sizes[64]; williamr@4: char __current_group_size = 0; williamr@2: char* __group_sizes_end = __group_sizes; williamr@4: williamr@2: _Integer __over_base = (numeric_limits<_Integer>::min)() / __STATIC_CAST(_Integer, __base); williamr@2: williamr@2: for ( ; __first != __last ; ++__first) { williamr@2: williamr@4: const _CharT __c = *__first; williamr@2: williamr@2: if (__is_group && __c == __separator) { williamr@4: *__group_sizes_end++ = __current_group_size; williamr@2: __current_group_size = 0; williamr@2: continue; williamr@2: } williamr@2: williamr@2: int __n = __get_digit_from_table(__c); williamr@2: williamr@2: if (__n >= __base) williamr@4: break; williamr@2: williamr@2: ++__got; williamr@2: ++__current_group_size; williamr@2: williamr@2: if (__result < __over_base) williamr@2: __ovflow = true; // don't need to keep accumulating williamr@2: else { williamr@2: _Integer __next = __STATIC_CAST(_Integer, __base * __result - __n); williamr@2: if (__result != 0) williamr@4: __ovflow = __ovflow || __next >= __result; williamr@2: __result = __next; williamr@2: } williamr@2: } williamr@2: williamr@2: if (__is_group && __group_sizes_end != __group_sizes) { williamr@2: *__group_sizes_end++ = __current_group_size; williamr@2: } williamr@2: williamr@2: // fbp : added to not modify value if nothing was read williamr@2: if (__got > 0) { williamr@4: __val = __ovflow ? __is_negative ? (numeric_limits<_Integer>::min)() williamr@4: : (numeric_limits<_Integer>::max)() williamr@4: : __is_negative ? __result williamr@4: : __STATIC_CAST(_Integer, -__result); williamr@2: } williamr@2: // overflow is being treated as failure williamr@4: return ((__got > 0) && !__ovflow) && williamr@4: (__is_group == 0 || williamr@4: __valid_grouping(__group_sizes, __group_sizes_end, williamr@4: __grouping.data(), __grouping.data()+ __grouping.size())); williamr@2: } williamr@2: williamr@4: template williamr@2: bool _STLP_CALL williamr@2: __get_integer(_InputIter& __first, _InputIter& __last, williamr@4: int __base, _Integer& __val, williamr@4: int __got, bool __is_negative, _CharT __separator, const string& __grouping, const __false_type& /*_IsSigned*/) { williamr@2: bool __ovflow = false; williamr@2: _Integer __result = 0; williamr@2: bool __is_group = !__grouping.empty(); williamr@4: char __group_sizes[64]; williamr@4: char __current_group_size = 0; williamr@2: char* __group_sizes_end = __group_sizes; williamr@2: williamr@2: _Integer __over_base = (numeric_limits<_Integer>::max)() / __STATIC_CAST(_Integer, __base); williamr@2: williamr@2: for ( ; __first != __last ; ++__first) { williamr@2: williamr@4: const _CharT __c = *__first; williamr@4: williamr@4: if (__is_group && __c == __separator) { williamr@4: *__group_sizes_end++ = __current_group_size; williamr@2: __current_group_size = 0; williamr@2: continue; williamr@2: } williamr@4: williamr@2: int __n = __get_digit_from_table(__c); williamr@2: williamr@2: if (__n >= __base) williamr@4: break; williamr@2: williamr@2: ++__got; williamr@2: ++__current_group_size; williamr@2: williamr@2: if (__result > __over_base) williamr@2: __ovflow = true; //don't need to keep accumulating williamr@2: else { williamr@2: _Integer __next = __STATIC_CAST(_Integer, __base * __result + __n); williamr@4: if (__result != 0) williamr@4: __ovflow = __ovflow || __next <= __result; williamr@4: __result = __next; williamr@2: } williamr@2: } williamr@2: williamr@2: if (__is_group && __group_sizes_end != __group_sizes) { williamr@4: *__group_sizes_end++ = __current_group_size; williamr@2: } williamr@2: williamr@2: // fbp : added to not modify value if nothing was read williamr@2: if (__got > 0) { williamr@4: __val = __ovflow ? (numeric_limits<_Integer>::max)() williamr@4: : (__is_negative ? __STATIC_CAST(_Integer, -__result) williamr@4: : __result); williamr@2: } williamr@2: williamr@2: // overflow is being treated as failure williamr@2: return ((__got > 0) && !__ovflow) && williamr@4: (__is_group == 0 || williamr@4: __valid_grouping(__group_sizes, __group_sizes_end, williamr@4: __grouping.data(), __grouping.data()+ __grouping.size())); williamr@2: } williamr@2: williamr@2: williamr@4: template williamr@2: bool _STLP_CALL williamr@4: __get_decimal_integer(_InputIter& __first, _InputIter& __last, _Integer& __val, _CharT* /*dummy*/) { williamr@2: string __grp; williamr@4: //Here there is no grouping so separator is not important, we just pass the default charater. williamr@4: return __get_integer(__first, __last, 10, __val, 0, false, _CharT() /*separator*/, __grp, __false_type()); williamr@2: } williamr@2: williamr@2: template williamr@2: _InputIter _STLP_CALL williamr@4: __do_get_integer(_InputIter& __in_ite, _InputIter& __end, ios_base& __str, williamr@4: ios_base::iostate& __err, _Integer& __val, _CharT* __pc) { williamr@4: #if defined (__HP_aCC) && (__HP_aCC == 1) williamr@2: bool _IsSigned = !((_Integer)(-1) > 0); williamr@2: #else williamr@2: typedef typename __bool2type::is_signed>::_Ret _IsSigned; williamr@2: #endif williamr@2: williamr@4: const numpunct<_CharT>& __numpunct = *__STATIC_CAST(const numpunct<_CharT>*, __str._M_numpunct_facet()); williamr@4: const string& __grouping = __str._M_grouping(); // cached copy williamr@2: williamr@4: const int __base_or_zero = __get_base_or_zero(__in_ite, __end, __str, __pc); williamr@2: int __got = __base_or_zero & 1; williamr@2: williamr@2: bool __result; williamr@2: williamr@4: if (__in_ite == __end) { // We may have already read a 0. If so, williamr@2: williamr@2: if (__got > 0) { // the result is 0 even if we're at eof. williamr@2: __val = 0; williamr@2: __result = true; williamr@2: } williamr@2: else williamr@2: __result = false; williamr@4: } williamr@4: else { williamr@4: const bool __negative = (__base_or_zero & 2) != 0; williamr@2: const int __base = __base_or_zero >> 2; williamr@2: williamr@4: #if defined (__HP_aCC) && (__HP_aCC == 1) williamr@4: if (_IsSigned) williamr@4: __result = __get_integer(__in_ite, __end, __base, __val, __got, __negative, __numpunct.thousands_sep(), __grouping, __true_type() ); williamr@4: else williamr@4: __result = __get_integer(__in_ite, __end, __base, __val, __got, __negative, __numpunct.thousands_sep(), __grouping, __false_type() ); williamr@2: #else williamr@4: __result = __get_integer(__in_ite, __end, __base, __val, __got, __negative, __numpunct.thousands_sep(), __grouping, _IsSigned()); williamr@2: # endif williamr@2: } williamr@2: williamr@2: __err = __STATIC_CAST(ios_base::iostate, __result ? ios_base::goodbit : ios_base::failbit); williamr@2: williamr@4: if (__in_ite == __end) williamr@2: __err |= ios_base::eofbit; williamr@4: return __in_ite; williamr@2: } williamr@2: williamr@4: // __read_float and its helper functions. williamr@2: template williamr@2: _InputIter _STLP_CALL williamr@4: __copy_sign(_InputIter __first, _InputIter __last, __iostring& __v, williamr@2: _CharT __xplus, _CharT __xminus) { williamr@4: if (__first != __last) { williamr@2: _CharT __c = *__first; williamr@2: if (__c == __xplus) williamr@2: ++__first; williamr@2: else if (__c == __xminus) { williamr@2: __v.push_back('-'); williamr@2: ++__first; williamr@2: } williamr@2: } williamr@2: return __first; williamr@2: } williamr@2: williamr@2: williamr@2: template williamr@2: bool _STLP_CALL williamr@4: __copy_digits(_InputIter& __first, _InputIter __last, williamr@4: __iostring& __v, const _CharT* __digits) { williamr@2: bool __ok = false; williamr@2: williamr@2: for ( ; __first != __last; ++__first) { williamr@2: _CharT __c = *__first; williamr@2: if (__get_fdigit(__c, __digits)) { williamr@2: __v.push_back((char)__c); williamr@2: __ok = true; williamr@2: } williamr@2: else williamr@2: break; williamr@2: } williamr@2: return __ok; williamr@2: } williamr@2: williamr@2: template williamr@2: bool _STLP_CALL williamr@4: __copy_grouped_digits(_InputIter& __first, _InputIter __last, williamr@4: __iostring& __v, const _CharT * __digits, williamr@4: _CharT __sep, const string& __grouping, williamr@4: bool& __grouping_ok) { williamr@2: bool __ok = false; williamr@4: char __group_sizes[64]; williamr@2: char*__group_sizes_end = __group_sizes; williamr@2: char __current_group_size = 0; williamr@2: williamr@2: for ( ; __first != __last; ++__first) { williamr@2: _CharT __c = *__first; williamr@2: bool __tmp = __get_fdigit_or_sep(__c, __sep, __digits); williamr@2: if (__tmp) { williamr@4: if (__c == ',') { williamr@4: *__group_sizes_end++ = __current_group_size; williamr@2: __current_group_size = 0; williamr@2: } williamr@2: else { williamr@2: __ok = true; williamr@2: __v.push_back((char)__c); williamr@2: ++__current_group_size; williamr@2: } williamr@2: } williamr@2: else williamr@2: break; williamr@2: } williamr@2: williamr@2: if (__group_sizes_end != __group_sizes) williamr@4: *__group_sizes_end++ = __current_group_size; williamr@2: __grouping_ok = __valid_grouping(__group_sizes, __group_sizes_end, __grouping.data(), __grouping.data() + __grouping.size()); williamr@2: return __ok; williamr@2: } williamr@2: williamr@2: williamr@2: template williamr@2: bool _STLP_CALL williamr@4: __read_float(__iostring& __buf, _InputIter& __in_ite, _InputIter& __end, ios_base& __s, _CharT*) { williamr@2: // Create a string, copying characters of the form williamr@2: // [+-]? [0-9]* .? [0-9]* ([eE] [+-]? [0-9]+)? williamr@2: williamr@2: bool __digits_before_dot /* = false */; williamr@2: bool __digits_after_dot = false; williamr@2: bool __ok; williamr@2: williamr@2: bool __grouping_ok = true; williamr@2: williamr@4: const ctype<_CharT>& __ct = *__STATIC_CAST(const ctype<_CharT>*, __s._M_ctype_facet()); williamr@4: const numpunct<_CharT>& __numpunct = *__STATIC_CAST(const numpunct<_CharT>*, __s._M_numpunct_facet()); williamr@4: const string& __grouping = __s._M_grouping(); // cached copy williamr@2: williamr@2: _CharT __dot = __numpunct.decimal_point(); williamr@2: _CharT __sep = __numpunct.thousands_sep(); williamr@2: williamr@2: _CharT __digits[10]; williamr@2: _CharT __xplus; williamr@2: _CharT __xminus; williamr@2: williamr@2: _CharT __pow_e; williamr@2: _CharT __pow_E; williamr@2: williamr@2: _Initialize_get_float(__ct, __xplus, __xminus, __pow_e, __pow_E, __digits); williamr@2: williamr@2: // Get an optional sign williamr@4: __in_ite = __copy_sign(__in_ite, __end, __buf, __xplus, __xminus); williamr@2: williamr@2: // Get an optional string of digits. williamr@4: if (!__grouping.empty()) williamr@4: __digits_before_dot = __copy_grouped_digits(__in_ite, __end, __buf, __digits, williamr@4: __sep, __grouping, __grouping_ok); williamr@2: else williamr@4: __digits_before_dot = __copy_digits(__in_ite, __end, __buf, __digits); williamr@2: williamr@2: // Get an optional decimal point, and an optional string of digits. williamr@4: if (__in_ite != __end && *__in_ite == __dot) { williamr@2: __buf.push_back('.'); williamr@4: ++__in_ite; williamr@4: __digits_after_dot = __copy_digits(__in_ite, __end, __buf, __digits); williamr@2: } williamr@2: williamr@2: // There have to be some digits, somewhere. williamr@2: __ok = __digits_before_dot || __digits_after_dot; williamr@2: williamr@2: // Get an optional exponent. williamr@4: if (__ok && __in_ite != __end && (*__in_ite == __pow_e || *__in_ite == __pow_E)) { williamr@2: __buf.push_back('e'); williamr@4: ++__in_ite; williamr@4: __in_ite = __copy_sign(__in_ite, __end, __buf, __xplus, __xminus); williamr@4: __ok = __copy_digits(__in_ite, __end, __buf, __digits); williamr@2: // If we have an exponent then the sign williamr@2: // is optional but the digits aren't. williamr@2: } williamr@2: williamr@2: return __ok; williamr@2: } williamr@2: williamr@4: _STLP_MOVE_TO_STD_NAMESPACE williamr@4: williamr@2: // williamr@2: // num_get<>, num_put<> williamr@2: // williamr@2: williamr@4: #if ( _STLP_STATIC_TEMPLATE_DATA > 0 ) williamr@4: # if !defined(__SYMBIAN32__WSD__) williamr@4: # if !defined (__BORLANDC__) && (defined (__SYMBIAN32__) && defined(_STLP_DESIGNATED_DLL)) williamr@2: template williamr@2: locale::id num_get<_CharT, _InputIterator>::id; williamr@4: # endif williamr@2: williamr@4: # if ((defined (__CYGWIN__) || defined (__MINGW32__)) && \ williamr@4: defined (_STLP_USE_DYNAMIC_LIB) && !defined (__BUILDING_STLPORT)) || (defined (__SYMBIAN32__) && defined(_STLP_DESIGNATED_DLL)) williamr@4: /* williamr@4: * Under cygwin, when STLport is used as a shared library, the id needs williamr@4: * to be specified as imported otherwise they will be duplicated in the williamr@4: * calling executable. williamr@4: */ williamr@4: # if defined(__SYMBIAN32__) williamr@4: template <> williamr@4: locale::id num_get > >::id; //data should not exported in symbian williamr@4: /* williamr@4: template <> williamr@4: _STLP_DECLSPEC locale::id num_get::id; williamr@4: */ williamr@4: williamr@4: # if !defined (STLP_NO_WCHAR_T) williamr@4: template <> williamr@4: locale::id num_get > >::id; williamr@4: /* williamr@4: template <> williamr@4: _STLP_DECLSPEC locale::id num_get::id; williamr@4: */ williamr@4: # endif//STLP_NO_WCHAR_T williamr@4: # else williamr@4: template <> williamr@4: _STLP_DECLSPEC locale::id num_get > >::id; williamr@4: /* williamr@4: template <> williamr@4: _STLP_DECLSPEC locale::id num_get::id; williamr@4: */ williamr@4: williamr@4: # if !defined (STLP_NO_WCHAR_T) williamr@4: template <> williamr@4: _STLP_DECLSPEC locale::id num_get > >::id; williamr@4: /* williamr@4: template <> williamr@4: _STLP_DECLSPEC locale::id num_get::id; williamr@4: */ williamr@4: # endif williamr@4: # endif//__SYMBIAN32__ williamr@4: williamr@4: # endif /* __CYGWIN__ && _STLP_USE_DYNAMIC_LIB */ williamr@4: #endif //__SYMBIAN32__WSD__ williamr@4: williamr@4: #else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */ williamr@4: williamr@4: //typedef num_get num_get_char; williamr@2: typedef num_get > > num_get_char_2; williamr@2: williamr@4: //__DECLARE_INSTANCE(locale::id, num_get_char::id, ); williamr@2: __DECLARE_INSTANCE(locale::id, num_get_char_2::id, ); williamr@2: williamr@4: # if !defined (_STLP_NO_WCHAR_T) williamr@2: williamr@4: //typedef num_get num_get_wchar_t; williamr@2: typedef num_get > > num_get_wchar_t_2; williamr@2: williamr@4: //__DECLARE_INSTANCE(locale::id, num_get_wchar_t::id, ); williamr@2: __DECLARE_INSTANCE(locale::id, num_get_wchar_t_2::id, ); williamr@2: williamr@4: # endif williamr@2: williamr@4: #endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */ williamr@2: williamr@4: #if !defined (_STLP_NO_BOOL) williamr@2: template williamr@2: _InputIter williamr@4: num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, williamr@2: ios_base& __s, williamr@4: ios_base::iostate& __err, bool& __x) const { williamr@2: if (__s.flags() & ios_base::boolalpha) { williamr@2: locale __loc = __s.getloc(); williamr@4: const _Numpunct& __np = *__STATIC_CAST(const _Numpunct*, __s._M_numpunct_facet()); williamr@4: // const numpunct<_CharT>& __np = use_facet >(__loc) ; williamr@2: // const ctype<_CharT>& __ct = use_facet >(__loc) ; williamr@2: williamr@2: const basic_string<_CharT> __truename = __np.truename(); williamr@2: const basic_string<_CharT> __falsename = __np.falsename(); williamr@2: bool __true_ok = true; williamr@2: bool __false_ok = true; williamr@2: williamr@2: size_t __n = 0; williamr@4: for ( ; __in_ite != __end; ++__in_ite) { williamr@4: _CharT __c = *__in_ite; williamr@2: __true_ok = __true_ok && (__c == __truename[__n]); williamr@2: __false_ok = __false_ok && (__c == __falsename[__n]); williamr@2: ++__n; williamr@2: williamr@2: if ((!__true_ok && !__false_ok) || williamr@2: (__true_ok && __n >= __truename.size()) || williamr@2: (__false_ok && __n >= __falsename.size())) { williamr@4: ++__in_ite; williamr@2: break; williamr@2: } williamr@2: } williamr@4: if (__true_ok && __n < __truename.size()) __true_ok = false; williamr@4: if (__false_ok && __n < __falsename.size()) __false_ok = false; williamr@2: williamr@2: if (__true_ok || __false_ok) { williamr@2: __err = ios_base::goodbit; williamr@2: __x = __true_ok; williamr@2: } williamr@2: else williamr@2: __err = ios_base::failbit; williamr@2: williamr@4: if (__in_ite == __end) williamr@2: __err |= ios_base::eofbit; williamr@2: williamr@4: return __in_ite; williamr@2: } williamr@2: williamr@2: else { williamr@2: long __lx; williamr@4: _InputIter __tmp = this->do_get(__in_ite, __end, __s, __err, __lx); williamr@2: if (!(__err & ios_base::failbit)) { williamr@2: if (__lx == 0) williamr@2: __x = false; williamr@2: else if (__lx == 1) williamr@2: __x = true; williamr@2: else williamr@2: __err |= ios_base::failbit; williamr@2: } williamr@2: return __tmp; williamr@2: } williamr@2: } williamr@2: williamr@4: #endif /* _STLP_NO_BOOL */ williamr@2: williamr@4: #if defined (_STLP_FIX_LIBRARY_ISSUES) williamr@2: template williamr@2: _InputIter williamr@4: num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str, williamr@4: ios_base::iostate& __err, short& __val) const williamr@4: { return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); } williamr@4: williamr@4: template williamr@4: _InputIter williamr@4: num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str, williamr@4: ios_base::iostate& __err, int& __val) const williamr@4: { return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); } williamr@4: williamr@4: #endif williamr@4: williamr@4: template williamr@4: _InputIter williamr@4: num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str, williamr@4: ios_base::iostate& __err, long& __val) const williamr@4: { return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); } williamr@4: williamr@4: template williamr@4: _InputIter williamr@4: num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str, williamr@4: ios_base::iostate& __err, williamr@4: unsigned short& __val) const williamr@4: { return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); } williamr@4: williamr@4: template williamr@4: _InputIter williamr@4: num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str, williamr@4: ios_base::iostate& __err, williamr@4: unsigned int& __val) const williamr@4: { return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); } williamr@4: williamr@4: template williamr@4: _InputIter williamr@4: num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str, williamr@4: ios_base::iostate& __err, williamr@4: unsigned long& __val) const williamr@4: { return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); } williamr@4: williamr@4: williamr@4: template williamr@4: _InputIter williamr@4: num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str, williamr@4: ios_base::iostate& __err, williamr@4: float& __val) const { williamr@4: _STLP_PRIV __iostring __buf ; williamr@4: bool __ok = _STLP_PRIV __read_float(__buf, __in_ite, __end, __str, (_CharT*)0 ); williamr@4: _STLP_PRIV __string_to_float(__buf, __val); williamr@4: __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit); williamr@4: if (__in_ite == __end) williamr@4: __err |= ios_base::eofbit; williamr@4: return __in_ite; williamr@2: } williamr@2: williamr@2: template williamr@2: _InputIter williamr@4: num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str, williamr@4: ios_base::iostate& __err, williamr@4: double& __val) const { williamr@4: _STLP_PRIV __iostring __buf ; williamr@4: bool __ok = _STLP_PRIV __read_float(__buf, __in_ite, __end, __str, (_CharT*)0 ); williamr@4: #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT williamr@4: if(__ok) williamr@4: { williamr@4: #endif williamr@4: _STLP_PRIV __string_to_float(__buf, __val); williamr@4: #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT williamr@4: } williamr@4: #endif williamr@4: __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit); williamr@4: if (__in_ite == __end) williamr@4: __err |= ios_base::eofbit; williamr@4: return __in_ite; williamr@2: } williamr@2: williamr@4: #if !defined (_STLP_NO_LONG_DOUBLE) williamr@2: template williamr@2: _InputIter williamr@4: num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str, williamr@2: ios_base::iostate& __err, williamr@4: long double& __val) const { williamr@4: _STLP_PRIV __iostring __buf ; williamr@4: bool __ok = _STLP_PRIV __read_float(__buf, __in_ite, __end, __str, (_CharT*)0 ); williamr@4: _STLP_PRIV __string_to_float(__buf, __val); williamr@2: __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit); williamr@4: if (__in_ite == __end) williamr@2: __err |= ios_base::eofbit; williamr@4: return __in_ite; williamr@2: } williamr@2: #endif /* _STLP_NO_LONG_DOUBLE */ williamr@2: williamr@2: template williamr@2: _InputIter williamr@4: num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str, williamr@2: ios_base::iostate& __err, williamr@2: void*& __p) const { williamr@4: #if defined (_STLP_LONG_LONG) && !defined (__MRC__) //*ty 12/07/2001 - MrCpp can not cast from long long to void* williamr@4: unsigned _STLP_LONG_LONG __val; williamr@2: #else williamr@2: unsigned long __val; williamr@4: #endif williamr@4: iter_type __tmp = _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); williamr@2: if (!(__err & ios_base::failbit)) williamr@4: __p = __REINTERPRET_CAST(void*,__val); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@4: #if defined (_STLP_LONG_LONG) williamr@2: template williamr@2: _InputIter williamr@4: num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str, williamr@2: ios_base::iostate& __err, williamr@2: _STLP_LONG_LONG& __val) const { williamr@4: return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); williamr@2: } williamr@2: williamr@2: template williamr@2: _InputIter williamr@4: num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str, williamr@2: ios_base::iostate& __err, williamr@2: unsigned _STLP_LONG_LONG& __val) const { williamr@4: return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); williamr@2: } williamr@2: #endif /* _STLP_LONG_LONG */ williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: #endif /* _STLP_NUMERIC_FACETS_C */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: