From: Joel Rosdahl Date: Mon, 18 Jul 2011 10:40:19 +0000 (+0200) Subject: Teach parse_size_with_suffix to parse float-style sizes X-Git-Tag: v3.2~205 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3631bf634fc6106681cd9c5099f6a275760ca48d;p=thirdparty%2Fccache.git Teach parse_size_with_suffix to parse float-style sizes --- diff --git a/test/test_util.c b/test/test_util.c index 3e1c86af3..50fc75610 100644 --- a/test/test_util.c +++ b/test/test_util.c @@ -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 e91e86124..f0b1c15fd 100644 --- 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; }