fix really bad breakage in strtol, etc.: failure to accept leading spaces

This commit is contained in:
Rich Felker 2012-04-19 12:47:34 -04:00
parent 769d3d3498
commit cb81b6947c
5 changed files with 9 additions and 10 deletions

View File

@ -394,12 +394,13 @@ static long double hexfloat(FILE *f, int bits, int emin, int sign, int pok)
return scalbnl(y, e2); return scalbnl(y, e2);
} }
long double __floatscan(FILE *f, int c, int prec, int pok) long double __floatscan(FILE *f, int prec, int pok)
{ {
int sign = 1; int sign = 1;
int i; int i;
int bits; int bits;
int emin; int emin;
int c;
switch (prec) { switch (prec) {
case 0: case 0:
@ -418,7 +419,7 @@ long double __floatscan(FILE *f, int c, int prec, int pok)
return 0; return 0;
} }
if (c<0) c = shgetc(f); while (isspace((c=shgetc(f))));
if (c=='+' || c=='-') { if (c=='+' || c=='-') {
sign -= 2*(c=='-'); sign -= 2*(c=='-');

View File

@ -3,6 +3,6 @@
#include <stdio.h> #include <stdio.h>
long double __floatscan(FILE *, int, int, int); long double __floatscan(FILE *, int, int);
#endif #endif

View File

@ -32,7 +32,7 @@ unsigned long long __intscan(FILE *f, unsigned base, int pok, unsigned long long
errno = EINVAL; errno = EINVAL;
return 0; return 0;
} }
c = shgetc(f); while (isspace((c=shgetc(f))));
if (c=='+' || c=='-') { if (c=='+' || c=='-') {
neg = -(c=='-'); neg = -(c=='-');
c = shgetc(f); c = shgetc(f);

View File

@ -291,7 +291,7 @@ int vfscanf(FILE *f, const char *fmt, va_list ap)
case 'e': case 'E': case 'e': case 'E':
case 'f': case 'F': case 'f': case 'F':
case 'g': case 'G': case 'g': case 'G':
y = __floatscan(f, -1, size, 0); y = __floatscan(f, size, 0);
if (!shcnt(f)) goto match_fail; if (!shcnt(f)) goto match_fail;
if (dest) switch (size) { if (dest) switch (size) {
case SIZE_def: case SIZE_def:

View File

@ -5,16 +5,14 @@
static long double strtox(const char *s, char **p, int prec) static long double strtox(const char *s, char **p, int prec)
{ {
char *t = (char *)s;
while (isspace(*t)) t++;
FILE f = { FILE f = {
.buf = (void *)t, .rpos = (void *)t, .buf = (void *)s, .rpos = (void *)s,
.rend = (void *)-1, .lock = -1 .rend = (void *)-1, .lock = -1
}; };
shlim(&f, 0); shlim(&f, 0);
long double y = __floatscan(&f, -1, prec, 1); long double y = __floatscan(&f, prec, 1);
off_t cnt = shcnt(&f); off_t cnt = shcnt(&f);
if (p) *p = cnt ? t + cnt : (char *)s; if (p) *p = cnt ? (char *)s + cnt : (char *)s;
return y; return y;
} }