c_locale.cc (__convert_to_v(long double&)): In v3 uses of sscanf...
authorPaolo Carlini <pcarlini@suse.de>
Wed, 31 Mar 2004 09:13:10 +0000 (09:13 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 31 Mar 2004 09:13:10 +0000 (09:13 +0000)
2004-03-31  Paolo Carlini  <pcarlini@suse.de>

* config/locale/generic/c_locale.cc (__convert_to_v(long double&)):
In v3 uses of sscanf, the special floating-point numbers INF,
INFINITY, etc., cannot occur in input, therefore, if the latter
is too large, ERANGE is always stored in errno, no need of finitel.

From-SVN: r80247

libstdc++-v3/ChangeLog
libstdc++-v3/config/locale/generic/c_locale.cc

index d78e3a949e00a60ee0eed8367288c7e7930cb57d..193a6a5820bcb8d573fc5f547e6af25660203ae9 100644 (file)
@@ -1,3 +1,10 @@
+2004-03-31  Paolo Carlini  <pcarlini@suse.de>
+
+       * config/locale/generic/c_locale.cc (__convert_to_v(long double&)):
+       In v3 uses of sscanf, the special floating-point numbers INF,
+       INFINITY, etc., cannot occur in input, therefore, if the latter
+       is too large, ERANGE is always stored in errno, no need of finitel.
+
 2004-03-30  Benjamin Kosnik  <bkoz@redhat.com>
 
        PR libstdc++/14783
index 730c3662ea6913c0b70686c7f711339b129dbc15..e183a969c2274b084e7806cf0fe68514de5c7606 100644 (file)
@@ -128,13 +128,8 @@ namespace std
          long double __ld;
          errno = 0;
          int __p = sscanf(__s, "%Lf", &__ld);
-         if (errno == ERANGE)
-           __p = 0;
-#ifdef _GLIBCXX_HAVE_FINITEL
-         if ((__p == 1) && !finitel (__ld))
-           __p = 0;
-#endif
-         if (__p && static_cast<int_type>(__p) != char_traits<char>::eof())
+         if (__p && static_cast<int_type>(__p) != char_traits<char>::eof()
+             && errno != ERANGE)
            __v = __ld;
 #endif
          else