summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>2001-09-14 07:43:36 +0000
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>2001-09-14 07:43:36 +0000
commit14f4379de0737ac714610b7092c649256da8c510 (patch)
tree9801d82fce246f18afa422f4737b2dbe205d5096 /libstdc++-v3
parent36252ea1f675af45068be134a780822c00f3acb8 (diff)
downloadgcc-14f4379de0737ac714610b7092c649256da8c510.tar.gz
2001-09-14 Benjamin Kosnik <bkoz@redhat.com>
* include/bits/locale_facets.tcc: Conditionalize use of strtold. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45591 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/include/bits/locale_facets.tcc37
2 files changed, 20 insertions, 23 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 66a4b8e759c..e22c32a05d7 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,4 +1,8 @@
-2001-09-13 Benjamin Kosnik <bkoz@redhat.com>
+2001-09-14 Benjamin Kosnik <bkoz@redhat.com>
+
+ * include/bits/locale_facets.tcc: Conditionalize use of strtold.
+
+2001-09-13 Benjamin Kosnik <bkoz@redhat.com>
Implement std::money_get.
* include/bits/locale_facets.tcc (money_get::do_get): Implement.
diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc
index ccf227e19cd..b3dcca8d7ea 100644
--- a/libstdc++-v3/include/bits/locale_facets.tcc
+++ b/libstdc++-v3/include/bits/locale_facets.tcc
@@ -244,12 +244,21 @@ namespace std
const _CharT* __wcs = __str.c_str();
__ctype.narrow(__wcs, __wcs + __str.size() + 1, char(), __cs);
+#if defined(_GLIBCPP_USE_C99) && !defined(__hpux)
char* __sanity;
errno = 0;
long double __ld = strtold(__cs, &__sanity);
if (!(__err & ios_base::failbit)
&& __sanity != __cs && *__sanity == '\0' && errno == 0)
__units = __ld;
+#else
+ typedef typename char_traits<_CharT>::int_type int_type;
+ long double __ld;
+ int __p = sscanf(__cs, "%Lf", &__ld);
+ if (!(__err & ios_base::failbit)
+ && __p && static_cast<int_type>(__p) != char_traits<_CharT>::eof())
+ __units = __ld;
+#endif
return __s;
}
@@ -998,7 +1007,6 @@ namespace std
return __beg;
}
-#if defined(_GLIBCPP_USE_C99) && !defined(__hpux)
template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
@@ -1012,6 +1020,7 @@ namespace std
int __base;
_M_extract(__beg, __end, __io, __err, __xtrc, __base, true);
+#if defined(_GLIBCPP_USE_C99) && !defined(__hpux)
// Stage 2: convert and store results.
char* __sanity;
errno = 0;
@@ -1019,23 +1028,7 @@ namespace std
if (!(__err & ios_base::failbit)
&& __sanity != __xtrc && *__sanity == '\0' && errno == 0)
__v = __ld;
- else
- __err |= ios_base::failbit;
-
- return __beg;
- }
#else
- template<typename _CharT, typename _InIter>
- _InIter
- num_get<_CharT, _InIter>::
- do_get(iter_type __beg, iter_type __end, ios_base& __io,
- ios_base::iostate& __err, long double& __v) const
- {
- // Stage 1: extract
- char __xtrc[32]= {'\0'};
- int __base;
- _M_extract(__beg, __end, __io, __err, __xtrc, __base, true);
-
// Stage 2: determine a conversion specifier.
ios_base::fmtflags __basefield = __io.flags() & ios_base::basefield;
const char* __conv;
@@ -1046,21 +1039,21 @@ namespace std
else if (__basefield == 0)
__conv = "%Li";
else
- __conv = "%Lg";
+ __conv = "%Lf";
// Stage 3: store results.
+ typedef typename __traits_type::int_type int_type;
long double __ld;
int __p = sscanf(__xtrc, __conv, &__ld);
- if (__p
- && static_cast<typename __traits_type::int_type>(__p)
- != __traits_type::eof())
+ if (!(__err & ios_base::failbit) && __p
+ && static_cast<int_type>(__p) != __traits_type::eof())
__v = __ld;
+#endif
else
__err |= ios_base::failbit;
return __beg;
}
-#endif
template<typename _CharT, typename _InIter>
_InIter