]> sigrok.org Git - libsigrok.git/commitdiff
strutil: insist in some mantissa for parse rational
authorGerhard Sittig <redacted>
Thu, 19 Jul 2018 20:12:15 +0000 (22:12 +0200)
committerUwe Hermann <redacted>
Sun, 22 Jul 2018 14:36:15 +0000 (16:36 +0200)
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.

src/strutil.c

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