accept "nan(n-char-sequence)" in strtod/scanf functions
[musl] / src / internal / floatscan.c
index 4b335f5..0825121 100644 (file)
@@ -199,11 +199,11 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po
                }
                if (carry) {
                        rp += 9;
+                       a = (a-1 & MASK);
                        if (a == z) {
                                z = (z-1 & MASK);
                                x[z-1 & MASK] |= x[z];
                        }
-                       a = (a-1 & MASK);
                        x[a] = carry;
                }
        }
@@ -352,7 +352,7 @@ static long double hexfloat(FILE *f, int bits, int emin, int sign, int pok)
                } else {
                        shlim(f, 0);
                }
-               return 0;
+               return sign * 0.0;
        }
        if (!gotrad) rp = dc;
        while (dc<8) x *= 16, dc++;
@@ -414,7 +414,7 @@ static long double hexfloat(FILE *f, int bits, int emin, int sign, int pok)
 long double __floatscan(FILE *f, int prec, int pok)
 {
        int sign = 1;
-       int i;
+       size_t i;
        int bits;
        int emin;
        int c;
@@ -455,6 +455,24 @@ long double __floatscan(FILE *f, int prec, int pok)
        if (!i) for (i=0; i<3 && (c|32)=="nan"[i]; i++)
                if (i<2) c = shgetc(f);
        if (i==3) {
+               if (shgetc(f) != '(') {
+                       shunget(f);
+                       return NAN;
+               }
+               for (i=1; ; i++) {
+                       c = shgetc(f);
+                       if (c-'0'<10U || c-'A'<26U || c-'a'<26U || c=='_')
+                               continue;
+                       if (c==')') return NAN;
+                       shunget(f);
+                       if (!pok) {
+                               errno = EINVAL;
+                               shlim(f, 0);
+                               return 0;
+                       }
+                       while (i--) shunget(f);
+                       return NAN;
+               }
                return NAN;
        }