strutil: insist in some mantissa for parse rational

The previous implementation accepted either empty integer or empty
fractional parts of a floating point number, but also when both parts
were missing ("." input). Insist in at least one of the parts to be
present.
This commit is contained in:
Gerhard Sittig 2018-07-19 22:12:15 +02:00 committed by Uwe Hermann
parent 7f5bfd6130
commit d875496366
1 changed files with 12 additions and 4 deletions

View File

@ -615,6 +615,7 @@ SR_API int sr_parse_rational(const char *str, struct sr_rational *ret)
int32_t fractional_len = 0; int32_t fractional_len = 0;
int32_t exponent = 0; int32_t exponent = 0;
bool is_negative = false; bool is_negative = false;
bool no_integer, no_fractional;
while (isspace(*str)) while (isspace(*str))
str++; str++;
@ -622,12 +623,16 @@ SR_API int sr_parse_rational(const char *str, struct sr_rational *ret)
errno = 0; errno = 0;
integral = g_ascii_strtoll(str, &endptr, 10); integral = g_ascii_strtoll(str, &endptr, 10);
if (str == endptr && (str[0] == '-' || str[0] == '+') && str[1] == '.') if (str == endptr && (str[0] == '-' || str[0] == '+') && str[1] == '.') {
endptr += 1; endptr += 1;
else if (str == endptr && str[0] == '.') no_integer = true;
/* EMPTY */; } else if (str == endptr && str[0] == '.') {
else if (errno) no_integer = true;
} else if (errno) {
return SR_ERR; return SR_ERR;
} else {
no_integer = false;
}
if (integral < 0 || str[0] == '-') if (integral < 0 || str[0] == '-')
is_negative = true; is_negative = true;
@ -645,6 +650,9 @@ SR_API int sr_parse_rational(const char *str, struct sr_rational *ret)
} }
if (errno) if (errno)
return SR_ERR; return SR_ERR;
no_fractional = endptr == start;
if (no_integer && no_fractional)
return SR_ERR;
fractional_len = endptr - start; fractional_len = endptr - start;
} }