]> sigrok.org Git - libsigrok.git/commitdiff
strutil: Correctly parse floating point frequencies in parse_size_string().
authorpoljar (Damir Jelić) <redacted>
Thu, 16 Jan 2014 01:53:40 +0000 (02:53 +0100)
committerBert Vermeulen <redacted>
Thu, 16 Jan 2014 08:35:38 +0000 (09:35 +0100)
parse_size_string() incorrectly parses a real number, e.g. 1.5 kHz ends up
being 1Hz.

This patch fixes parse_size_string() to take the fractional part as well into
account. The fractional part is parsed as an double precision floating point
number while ignoring the locale.

strutil.c

index 17d59e8d8850dba638ccb4a3eac35ec9f45bbfe5..f4e4825935d487034cac863af8994acd741cf43a 100644 (file)
--- a/strutil.c
+++ b/strutil.c
@@ -422,15 +422,20 @@ SR_API char **sr_parse_triggerstring(const struct sr_dev_inst *sdi,
 SR_API int sr_parse_sizestring(const char *sizestring, uint64_t *size)
 {
        int multiplier, done;
+       double frac_part;
        char *s;
 
        *size = strtoull(sizestring, &s, 10);
        multiplier = 0;
+       frac_part = 0;
        done = FALSE;
        while (s && *s && multiplier == 0 && !done) {
                switch (*s) {
                case ' ':
                        break;
+               case '.':
+                       frac_part = g_ascii_strtod(s, &s);
+                       break;
                case 'k':
                case 'K':
                        multiplier = SR_KHZ(1);
@@ -449,8 +454,11 @@ SR_API int sr_parse_sizestring(const char *sizestring, uint64_t *size)
                }
                s++;
        }
-       if (multiplier > 0)
+       if (multiplier > 0) {
                *size *= multiplier;
+               *size += frac_part * multiplier;
+       } else
+               *size += frac_part;
 
        if (*s && strcasecmp(s, "Hz"))
                return SR_ERR;