]> sigrok.org Git - libsigrok.git/blobdiff - src/strutil.c
SCPI: Ignore IDN header in *IDN? response
[libsigrok.git] / src / strutil.c
index fd9a438e647a6210e63091050b78c7790ffe97be..5f0deb7708f374327b6c5d33e7649ca3da342948 100644 (file)
@@ -23,6 +23,7 @@
 #include <string.h>
 #include <strings.h>
 #include <errno.h>
+#include <stdbool.h>
 #include <libsigrok/libsigrok.h>
 #include "libsigrok-internal.h"
 
@@ -233,13 +234,19 @@ SR_API int sr_parse_rational(const char *str, struct sr_rational *ret)
        int64_t denominator = 1;
        int32_t fractional_len = 0;
        int32_t exponent = 0;
+       bool is_negative = false;
 
        errno = 0;
        integral = g_ascii_strtoll(str, &endptr, 10);
 
-       if (errno)
+       if (str == endptr && (str[0] == '-' || str[0] == '+') && str[1] == '.')
+               endptr += 1;
+       else if (errno)
                return SR_ERR;
 
+       if (integral < 0 || str[0] == '-')
+               is_negative = true;
+
        if (*endptr == '.') {
                const char* start = endptr + 1;
                fractional = g_ascii_strtoll(start, &endptr, 10);
@@ -261,7 +268,7 @@ SR_API int sr_parse_rational(const char *str, struct sr_rational *ret)
                integral *= 10;
        exponent -= fractional_len;
 
-       if (integral >= 0)
+       if (!is_negative)
                integral += fractional;
        else
                integral -= fractional;