X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Finternal%2Ffloatscan.c;h=28a09c252837033fe78ffa90ecdcd55a2450d04f;hp=d5444daaff8e03cf61ae93f9648e6f92129dd293;hb=470fecdd3aa90a1787a4f678a8cb76d3641fa9a9;hpb=1bdd5c8b9868ebc092074e078604acb80546e43f diff --git a/src/internal/floatscan.c b/src/internal/floatscan.c index d5444daa..28a09c25 100644 --- a/src/internal/floatscan.c +++ b/src/internal/floatscan.c @@ -77,7 +77,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po if (c == '.') { if (lrp!=-1) break; lrp = dc; - } else if (k < KMAX) { + } else if (k < KMAX-2) { dc++; if (j) x[k] = x[k]*10 + c-'0'; else x[k] = c-'0'; @@ -88,7 +88,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po gotdig=1; } else { dc++; - x[KMAX-1] |= c-'0'; + if (c!='0') x[KMAX-3] |= 1; } } if (lrp==-1) lrp=dc; @@ -146,7 +146,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po int rpm9 = rp>=0 ? rp%9 : rp%9+9; int p10 = p10s[rpm9-1]; uint32_t carry = 0; - for (k=a; k!=z; k=(k+1 & MASK)) { + for (k=a; k!=z; k++) { uint32_t tmp = x[k] % p10; x[k] = x[k]/p10 + carry; carry = 1000000000/p10 * tmp; @@ -155,16 +155,11 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po rp -= 9; } } - if (carry) { - if ((z+1 & MASK) != a) { - x[z] = carry; - z = (z+1 & MASK); - } else x[z-1 & MASK] |= 1; - } + if (carry) x[z++] = carry; rp += 9-rpm9; } - while (rp < 9*LD_B1B_DIG || (rp == 9*LD_B1B_DIG && x[0]>sh) * tmp; if (k==a && !x[k]) { a = (a+1 & MASK); + i--; rp -= 9; } }