[U-Boot] [PATCH] [v4] allow print_size to print large numbers on 32-bit systems

Timur Tabi timur at freescale.com
Mon Apr 12 23:19:50 CEST 2010


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 <timur at freescale.com>
---

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(-)

diff --git a/lib_generic/display_options.c b/lib_generic/display_options.c
index da17a62..86df05d 100644
--- a/lib_generic/display_options.c
+++ b/lib_generic/display_options.c
@@ -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);
 }
 
 /*
-- 
1.6.5



More information about the U-Boot mailing list