Files
mango/util/data_size.c

67 lines
1.5 KiB
C
Raw Normal View History

2023-02-01 12:26:07 +00:00
#include <stddef.h>
2024-11-02 11:31:51 +00:00
#include <mango/libc/stdio.h>
2023-02-01 12:26:07 +00:00
struct magnitude {
size_t threshold;
const char *suffix;
};
#define USE_BASE2
/* This list must be in decending order of threshold */
#ifdef USE_BASE2
static struct magnitude k_magnitudes[] = {
{ 0x10000000000, "TiB" },
{ 0x40000000, "GiB" },
{ 0x100000, "MiB" },
{ 0x400, "KiB" },
{ 0x00, "B" },
};
#else
static struct magnitude k_magnitudes[] = {
{ 1000000000000, "TB" },
{ 1000000000, "GB" },
{ 1000000, "MB" },
{ 1000, "KB" },
{ 0, "B" },
};
#endif
static void convert(size_t *big, size_t *small, size_t val, size_t threshold)
{
if (!threshold) {
*big = val;
*small = 0;
return;
}
*big = val / threshold;
size_t rem = val % threshold;
*small = (10 * rem) / threshold;
}
void data_size_to_string(size_t value, char *out, size_t outsz)
{
if (!value) {
snprintf(out, outsz, "0 B");
return;
}
size_t def_count = sizeof(k_magnitudes) / sizeof(struct magnitude);
for (size_t i = 0; i < def_count; i++) {
if (value >= k_magnitudes[i].threshold) {
2023-02-01 12:26:07 +00:00
size_t big, small;
convert(&big, &small, value, k_magnitudes[i].threshold);
if (small) {
snprintf(out, outsz, "%zu.%zu %s", big, small, k_magnitudes[i].suffix);
} else {
snprintf(out, outsz, "%zu %s", big, k_magnitudes[i].suffix);
}
return;
}
}
*out = 0;
}