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
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':
default:
return false;
}
+ *size = x;
return true;
}