fix some bug of strtold
with the test of sim:lua ,I have fixed some bug of error output 1.input: " " and error output string is "NULL" 2.input: "1.2e+", error output string is "NULL" 3.input: "." error output string is "NULL"
This commit is contained in:
parent
807d59632c
commit
23344846f6
@ -119,7 +119,7 @@ static long_long scanexp(FAR char **f, bool flag)
|
|||||||
|
|
||||||
c = shgetc(s);
|
c = shgetc(s);
|
||||||
|
|
||||||
if (c == '+' || c == '-')
|
if ((c == '+' || c == '-') && isdigit(*s))
|
||||||
{
|
{
|
||||||
neg = (c == '-');
|
neg = (c == '-');
|
||||||
c = shgetc(s);
|
c = shgetc(s);
|
||||||
@ -335,13 +335,6 @@ static long_double decfloat(FAR char *ptr, FAR char **endptr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (num_digit == 0)
|
|
||||||
{
|
|
||||||
shunget(f);
|
|
||||||
ifexist(endptr, f);
|
|
||||||
return zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((c | 32) == 'e')
|
if ((c | 32) == 'e')
|
||||||
{
|
{
|
||||||
num_decimal = scanexp(&f, 1) + num_decimal;
|
num_decimal = scanexp(&f, 1) + num_decimal;
|
||||||
@ -357,6 +350,11 @@ static long_double decfloat(FAR char *ptr, FAR char **endptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ifexist(endptr, f);
|
ifexist(endptr, f);
|
||||||
|
if (num_digit == 0)
|
||||||
|
{
|
||||||
|
return zero;
|
||||||
|
}
|
||||||
|
|
||||||
f = ptr;
|
f = ptr;
|
||||||
|
|
||||||
k = 0;
|
k = 0;
|
||||||
@ -475,7 +473,7 @@ static long_double hexfloat(FAR char *ptr,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; c - '0' < 10 || (c | 32) - 'a' < 6 || c == '.'; c = shgetc(f))
|
for (; isxdigit(c) || c == '.'; c = shgetc(f))
|
||||||
{
|
{
|
||||||
if (c == '.')
|
if (c == '.')
|
||||||
{
|
{
|
||||||
@ -519,7 +517,6 @@ static long_double hexfloat(FAR char *ptr,
|
|||||||
|
|
||||||
if (!gotdig)
|
if (!gotdig)
|
||||||
{
|
{
|
||||||
shunget(f);
|
|
||||||
shunget(f);
|
shunget(f);
|
||||||
if (gotrad)
|
if (gotrad)
|
||||||
{
|
{
|
||||||
@ -642,7 +639,7 @@ static long_double hexfloat(FAR char *ptr,
|
|||||||
static long_double strtox(FAR const char *str, FAR char **endptr, int flag)
|
static long_double strtox(FAR const char *str, FAR char **endptr, int flag)
|
||||||
{
|
{
|
||||||
FAR char *s = (FAR char *)str;
|
FAR char *s = (FAR char *)str;
|
||||||
int negative = 0;
|
bool negative = 0;
|
||||||
long_double y = 0;
|
long_double y = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
@ -662,6 +659,7 @@ static long_double strtox(FAR const char *str, FAR char **endptr, int flag)
|
|||||||
case 3:
|
case 3:
|
||||||
bits = LDBL_MANT_DIG,
|
bits = LDBL_MANT_DIG,
|
||||||
emin = LDBL_MIN_EXP - bits;
|
emin = LDBL_MIN_EXP - bits;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -718,10 +716,15 @@ static long_double strtox(FAR const char *str, FAR char **endptr, int flag)
|
|||||||
s += 2;
|
s += 2;
|
||||||
y = hexfloat(s, endptr, bits, emin);
|
y = hexfloat(s, endptr, bits, emin);
|
||||||
}
|
}
|
||||||
else
|
else if (isdigit(*s) || (*s == '.' && isdigit(*(s + 1))))
|
||||||
{
|
{
|
||||||
y = decfloat(s, endptr);
|
y = decfloat(s, endptr);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ifexist(endptr, (FAR char *)str);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return negative ? -y : y;
|
return negative ? -y : y;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user