OSDN Git Service

* libc/stdlib/strtod.c (_strtod_r): Fix nf/nd counts to not exceed
authorcorinna <corinna>
Mon, 16 May 2011 13:34:04 +0000 (13:34 +0000)
committercorinna <corinna>
Mon, 16 May 2011 13:34:04 +0000 (13:34 +0000)
DBL_DIG.

newlib/ChangeLog
newlib/libc/stdlib/strtod.c

index 90dc61d..4f4de06 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-16  Christian Bruel  <christian.bruel@st.com>
+
+       * libc/stdlib/strtod.c (_strtod_r): Fix nf/nd counts to not exceed
+       DBL_DIG.
+
 2011-05-15  Corinna Vinschen  <vinschen@redhat.com>
 
        * libc/include/sys/features.h (_POSIX_THREAD_ATTR_STACKADDR): Define
index fe6aac2..7e73b12 100644 (file)
@@ -309,8 +309,7 @@ _DEFUN (_strtod_r, (ptr, s00, se),
         }
        nd0 = nd;
        if (strncmp (s, _localeconv_r (ptr)->decimal_point,
-                    strlen (_localeconv_r (ptr)->decimal_point)) == 0)
-               {
+                    strlen (_localeconv_r (ptr)->decimal_point)) == 0) {
                decpt = 1;
                c = *(s += strlen (_localeconv_r (ptr)->decimal_point));
                if (!nd) {
@@ -328,25 +327,28 @@ _DEFUN (_strtod_r, (ptr, s00, se),
  have_dig:
                        nz++;
                        if (c -= '0') {
-                               nf += nz;
                                for(i = 1; i < nz; i++) {
-                                       if (nd++ <= DBL_DIG + 1) {
-                                               if (nd < 10)
+                                       if (nd <= DBL_DIG + 1) {
+                                               if (nd + i < 10)
                                                        y *= 10;
                                                else
                                                        z *= 10;
                                        }
                                }
-                               if (nd++ <= DBL_DIG + 1) {
-                                       if (nd < 10)
+                               if (nd <= DBL_DIG + 1) {
+                                       if (nd + i < 10)
                                                y = 10*y + c;
                                        else
                                                z = 10*z + c;
                                }
-                               nz = 0;
+                               if (nd <= DBL_DIG + 1) {
+                                       nf += nz;
+                                       nd += nz;
                                }
+                               nz = 0;
                        }
                }
+       }
  dig_done:
        e = 0;
        if (c == 'e' || c == 'E') {