diff options
author | Sören Tempel <soeren+git@soeren-tempel.net> | 2018-10-11 13:39:25 +0200 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2020-01-05 23:26:50 +0200 |
commit | a6039e38a42cc977f7f9da3dcc69e7f98317b4c1 (patch) | |
tree | 630e5b6709d6878240b80aca488b19b4d1868ee7 /src/print.c | |
parent | 0b82bcc53e6027c74fae2c972d5d9fff54d95d6c (diff) | |
download | aports-a6039e38a42cc977f7f9da3dcc69e7f98317b4c1.tar.bz2 aports-a6039e38a42cc977f7f9da3dcc69e7f98317b4c1.tar.xz |
Humanize size output of `apk info`
This commits adds a function for receiving the closet byte unit and the
size in that unit for a given size_t. The function doesn't return a
string since dynamic memory allocation (or a static buffer) would be
required to implement this properly.
Discussion: It might be useful to add a command line flag for disabling
this behaviour in order to retain compatibility with the previous apk
info output format.
Diffstat (limited to 'src/print.c')
-rw-r--r-- | src/print.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/print.c b/src/print.c index b2bbca49f8..21b8db78f0 100644 --- a/src/print.c +++ b/src/print.c @@ -9,12 +9,14 @@ * by the Free Software Foundation. See http://www.gnu.org/ for details. */ +#include <assert.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <malloc.h> #include <errno.h> #include <sys/ioctl.h> +#include <sys/types.h> #include "apk_defines.h" #include "apk_print.h" @@ -23,6 +25,7 @@ int apk_progress_fd; static int apk_screen_width = 0; static int apk_progress_force = 1; static const char *apk_progress_char = "#"; +static const char *apk_size_units[] = {"B", "KiB", "MiB", "GiB", "TiB"}; void apk_reset_screen_width(void) { @@ -53,6 +56,21 @@ int apk_get_screen_width(void) return apk_screen_width; } +const char *apk_get_human_size(off_t size, off_t *dest) +{ + size_t i; + off_t s; + + assert(size >= 0); + + for (i = 0, s = size; s >= 10000 && + i < ARRAY_SIZE(apk_size_units); i++) + s /= 1024; + + if (dest) *dest = s; + return apk_size_units[min(i, ARRAY_SIZE(apk_size_units) - 1)]; +} + void apk_print_progress(size_t done, size_t total) { static size_t last_done = 0; |