char *remove_extension(const char *path);
size_t file_size(struct stat *st);
int safe_create_wronly(const char *fname);
-char *format_human_readable_size(size_t v);
+char *format_human_readable_size(size_t size);
+char *format_parsable_size_with_suffix(size_t size);
bool parse_size_with_suffix(const char *str, size_t *size);
char *x_realpath(const char *path);
char *gnu_getcwd(void);
format_human_readable_size(17.11 * 1024 * 1024));
}
+TEST(format_parsable_size_with_suffix)
+{
+ CHECK_STR_EQ_FREE2("0", format_parsable_size_with_suffix(0));
+ CHECK_STR_EQ_FREE2("42K", format_parsable_size_with_suffix(42));
+ CHECK_STR_EQ_FREE2("1.0M", format_parsable_size_with_suffix(1024));
+ CHECK_STR_EQ_FREE2("1.2M", format_parsable_size_with_suffix(1234));
+ CHECK_STR_EQ_FREE2("438.5M",
+ format_parsable_size_with_suffix(438.5 * 1024));
+ CHECK_STR_EQ_FREE2("1.0G",
+ format_parsable_size_with_suffix(1024 * 1024));
+ CHECK_STR_EQ_FREE2("17.1G",
+ format_parsable_size_with_suffix(17.11 * 1024 * 1024));
+}
+
TEST_SUITE_END
return s;
}
+/* Format a size (in KiB) as a human-readable string. Caller frees. */
+char *
+format_parsable_size_with_suffix(size_t size)
+{
+ char *s;
+ if (size >= 1024*1024) {
+ s = format("%.1fG", size / ((double)(1024*1024)));
+ } else if (size >= 1024) {
+ s = format("%.1fM", size / ((double)(1024)));
+ } else if (size > 0) {
+ s = format("%.0fK", (double)size);
+ } else {
+ s = x_strdup("0");
+ }
+ return s;
+}
+
/*
* Parse a value in multiples of 1024 given a string that can end in K, M or G.
* Default suffix: G.