]> sigrok.org Git - libsigrok.git/blobdiff - src/strutil.c
tests: add (negative) "." test case for rational conversion
[libsigrok.git] / src / strutil.c
index 5f48e87bebc02cd2f0eaca8c516aba7b6349e5a1..b6c910f70ca1b70ccdad881251b4de1178b56fb3 100644 (file)
@@ -615,26 +615,48 @@ 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++;
 
        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 (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;
 
+       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;
+               no_fractional = endptr == start;
+               if (no_integer && no_fractional)
+                       return SR_ERR;
                fractional_len = endptr - start;
        }
 
+       errno = 0;
        if ((*endptr == 'E') || (*endptr == 'e')) {
                exponent = g_ascii_strtoll(endptr + 1, &endptr, 10);
                if (errno)