refactor headers, especially alltypes.h, and improve C++ ABI compat
[musl] / src / internal / floatscan.c
index 68f576c..f6e331d 100644 (file)
@@ -4,6 +4,7 @@
 #include <float.h>
 #include <limits.h>
 #include <errno.h>
+#include <ctype.h>
 
 #include "shgetc.h"
 #include "floatscan.h"
@@ -199,11 +200,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;
                }
        }
@@ -414,7 +415,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 +456,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;
        }