mirror of
git://git.musl-libc.org/musl
synced 2024-12-15 03:05:15 +00:00
fix really bad breakage in strtol, etc.: failure to accept leading spaces
This commit is contained in:
parent
769d3d3498
commit
cb81b6947c
@ -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=='-');
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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:
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user