allow print_size to print large numbers on 32-bit systems
PATCH v4 1/1 allow print_size to print large numbers on 32-bit systems
Modify print_size() so that it can accept numbers larger than 4GB on 32-bit systems.
Add support for display terabyte, petabyte, and exabyte sizes. Change the output to use International Electrotechnical Commission binary prefix standard.
Signed-off-by Timur Tabi <[email protected]>
---
optimized the loop. If I had a log-base-10 function, I could eliminate it completely, but it appears only ppc has __ilog2.
lib_generic/display_options.c | 29 +++++++++++++++++------------ 1 files changed, 17 insertions(+), 12 deletions(-)
lib_generic/display_options.c +18 -13
@@ -39,25 +39,30 @@ int display_options (void) }/* -* print sizes as "xxx kB", "xxx.y kB", "xxx MB", "xxx.y MB", -* xxx GB, or xxx.y GB as needed; allow for optional trailing string +* print sizes as "xxx KiB", "xxx.y KiB", "xxx MiB", "xxx.y MiB", +* xxx GiB, xxx.y GiB, etc as needed; allow for optional trailing string * (like "\n") */ void print_size (unsigned long long size,const char *s) {unsigned long m =0 , n; -unsigned long long d =1 <<30 ;/* 1 GB */ -char c ='G' ; - -if (size < d) {/* try MB */ - c ='M' ; - d =1 <<20 ; -if (size < d) {/* print in kB */ - c ='k' ; - d =1 <<10 ; +static const char names[] = {'E' ,'P' ,'T' ,'G' ,'M' ,'K' }; +unsigned long long d =1ULL << (10 *ARRAY_SIZE (names)); +char c =0 ; +unsigned int i; + +for (i =0 ; i <ARRAY_SIZE (names); i++, d >>=10 ) { +if (size >= d) { + c = names[i]; +break ; } } +if (!c) { +printf ("%llu Bytes%s" , size, s); +return ; + } + n = size / d;/* If there's a remainder, deal with it */
@@ -70,11 +75,11 @@ void print_size(unsigned long long size, const char *s) } } -printf ("%2ld" , n); +printf ("%lu" , n);if (m) {printf (".%ld" , m); } -printf (" %cB%s" , c, s); +printf (" %ciB%s" , c, s); }/*
Signature · 1 line
1.6.5