]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Teach parse_size_with_suffix to parse float-style sizes
authorJoel Rosdahl <joel@rosdahl.net>
Mon, 18 Jul 2011 10:40:19 +0000 (12:40 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Wed, 20 Jul 2011 21:31:38 +0000 (23:31 +0200)
test/test_util.c
util.c

index 3e1c86af30266098de03b8826b034a9016c86bf6..50fc7561035ea477a8ead043ba6ae2a8e817729a 100644 (file)
@@ -120,4 +120,23 @@ TEST(format_parsable_size_with_suffix)
                           format_parsable_size_with_suffix(17.11 * 1024 * 1024));
 }
 
+TEST(parse_size_with_suffix)
+{
+       size_t size;
+       CHECK(parse_size_with_suffix("0", &size));
+       CHECK_UNS_EQ(0, size);
+       CHECK(parse_size_with_suffix("42K", &size));
+       CHECK_UNS_EQ(42, size);
+       CHECK(parse_size_with_suffix("1.0M", &size));
+       CHECK_UNS_EQ(1024, size);
+       CHECK(parse_size_with_suffix("1.1M", &size));
+       CHECK_UNS_EQ(1.1 * 1024, size);
+       CHECK(parse_size_with_suffix("438.5M", &size));
+       CHECK_UNS_EQ(438.5 * 1024, size);
+       CHECK(parse_size_with_suffix("1.0G", &size));
+       CHECK_UNS_EQ(1024 * 1024, size);
+       CHECK(parse_size_with_suffix("17.1G", &size));
+       CHECK_UNS_EQ(17.1 * 1024 * 1024, size);
+}
+
 TEST_SUITE_END
diff --git a/util.c b/util.c
index e91e861244e7e7fac7ecbb72d480ad85272976f7..f0b1c15fd2792e428d37297c3d81fe8216045ff5 100644 (file)
--- a/util.c
+++ b/util.c
@@ -855,23 +855,22 @@ bool
 parse_size_with_suffix(const char *str, size_t *size)
 {
        char *endptr;
-       long x;
+       double x;
        errno = 0;
-       x = strtol(str, &endptr, 10);
+       x = strtod(str, &endptr);
        if (errno != 0 || x < 0 || endptr == str || *str == '\0') {
                return false;
        }
 
-       *size = x;
        switch (*endptr) {
        case 'G':
        case 'g':
        case '\0':
-               *size *= 1024 * 1024;
+               x *= 1024 * 1024;
                break;
        case 'M':
        case 'm':
-               *size *= 1024;
+               x *= 1024;
                break;
        case 'K':
        case 'k':
@@ -879,6 +878,7 @@ parse_size_with_suffix(const char *str, size_t *size)
        default:
                return false;
        }
+       *size = x;
        return true;
 }