diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/internal/floatscan.c | 13 | 
1 files changed, 9 insertions, 4 deletions
| diff --git a/src/internal/floatscan.c b/src/internal/floatscan.c index b260381e..dbe07987 100644 --- a/src/internal/floatscan.c +++ b/src/internal/floatscan.c @@ -57,10 +57,10 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po  	uint32_t x[KMAX];  	static const uint32_t th[] = { LD_B1B_MAX };  	int i, j, k, a, z; -	long long lrp=-1, dc=0; +	long long lrp=0, dc=0;  	long long e10=0;  	int lnz = 0; -	int gotdig = 0; +	int gotdig = 0, gotrad = 0;  	int rp;  	int e2;  	long double y; @@ -74,11 +74,16 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po  	/* Don't let leading zeros consume buffer space */  	for (; c=='0'; c = shgetc(f)) gotdig=1; +	if (c=='.') { +		gotrad = 1; +		for (c = shgetc(f); c=='0'; c = shgetc(f)) gotdig=1, lrp--; +	}  	x[0] = 0;  	for (; c-'0'<10U || c=='.'; c = shgetc(f)) {  		if (c == '.') { -			if (lrp!=-1) break; +			if (gotrad) break; +			gotrad = 1;  			lrp = dc;  		} else if (k < KMAX-2) {  			dc++; @@ -95,7 +100,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po  			if (c!='0') x[KMAX-3] |= 1;  		}  	} -	if (lrp==-1) lrp=dc; +	if (!gotrad) lrp=dc;  	if (gotdig && (c|32)=='e') {  		e10 = scanexp(f, pok); | 
