Explorar el Código

skip leading zeros even after decimal point in floatscan

in principle this should just be an optimization, but it happens to
also fix a nasty bug where values like 0.00000000001 were getting
caught by the early zero detection path and wrongly scanned as zero.
Rich Felker hace 13 años
padre
commit
2df2a97a20
Se han modificado 1 ficheros con 9 adiciones y 4 borrados
  1. 9 4
      src/internal/floatscan.c

+ 9 - 4
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);