X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fstrutil.c;h=28f202c9801547e2716d332cf56f7f67c75396c2;hb=42408643f9dcb80d1744aaa4d08e0170594daad1;hp=5f48e87bebc02cd2f0eaca8c516aba7b6349e5a1;hpb=21ef355e503278a3d2a215c87b0d48112276330a;p=libsigrok.git diff --git a/src/strutil.c b/src/strutil.c index 5f48e87b..28f202c9 100644 --- a/src/strutil.c +++ b/src/strutil.c @@ -621,20 +621,31 @@ SR_API int sr_parse_rational(const char *str, struct sr_rational *ret) if (str == endptr && (str[0] == '-' || str[0] == '+') && str[1] == '.') endptr += 1; + else if (str == endptr && str[0] == '.') + /* EMPTY */; else if (errno) return SR_ERR; if (integral < 0 || str[0] == '-') is_negative = true; + errno = 0; if (*endptr == '.') { - const char* start = endptr + 1; + bool is_exp, is_eos; + const char *start = endptr + 1; fractional = g_ascii_strtoll(start, &endptr, 10); + is_exp = *endptr == 'E' || *endptr == 'e'; + is_eos = *endptr == '\0'; + if (endptr == start && (is_exp || is_eos)) { + fractional = 0; + errno = 0; + } if (errno) return SR_ERR; fractional_len = endptr - start; } + errno = 0; if ((*endptr == 'E') || (*endptr == 'e')) { exponent = g_ascii_strtoll(endptr + 1, &endptr, 10); if (errno)