mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Wolfram Sang <w.sang@pengutronix.de>
To: barebox@lists.infradead.org
Cc: Wolfram Sang <w.sang@pengutronix.de>
Subject: [PATCH V3 03/11] lib: update size_human_readable to latest version
Date: Mon, 17 Dec 2012 16:48:25 +0100	[thread overview]
Message-ID: <1355759313-23329-4-git-send-email-w.sang@pengutronix.de> (raw)
In-Reply-To: <1355759313-23329-1-git-send-email-w.sang@pengutronix.de>

Copy over the latest version from u-boot which handles bigger sizes now
and does arithmetic with shifts instead of divisions.

Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
---
 include/common.h      |    2 +-
 lib/display_options.c |   47 +++++++++++++++++++++++++++++++----------------
 2 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/include/common.h b/include/common.h
index e30774a..1939427 100644
--- a/include/common.h
+++ b/include/common.h
@@ -105,7 +105,7 @@ void reginfo(void);
 void __noreturn hang (void);
 void __noreturn panic(const char *fmt, ...);
 
-char *size_human_readable(ulong size);
+char *size_human_readable(unsigned long long size);
 
 /* common/main.c */
 int	run_command	(const char *cmd, int flag);
diff --git a/lib/display_options.c b/lib/display_options.c
index a6050cb..0871552 100644
--- a/lib/display_options.c
+++ b/lib/display_options.c
@@ -21,35 +21,50 @@
 
 /*
  * return a pointer to a string containing the size
- * as "xxx kB", "xxx.y kB", "xxx MB" or "xxx.y MB" as needed;
+ *"as xxx KiB", "xxx.y KiB", "xxx MiB", "xxx.y MiB",
+ * xxx GiB, xxx.y GiB, etc as needed;
  */
-char *size_human_readable(ulong size)
+char *size_human_readable(unsigned long long size)
 {
 	static char buf[20];
-	ulong m, n;
-	ulong d = 1 << 20;		/* 1 MB */
-	char  c = 'M';
+	unsigned long m = 0, n;
+	unsigned long long f;
+	static const char names[] = {'E', 'P', 'T', 'G', 'M', 'K'};
+	unsigned long d = 10 * ARRAY_SIZE(names);
+	char c = 0;
+	unsigned int i;
 	char *ptr = buf;
 
-	if (size < d) {			/* print in kB */
-		c = 'k';
-		d = 1 << 10;
+	for (i = 0; i < ARRAY_SIZE(names); i++, d -= 10) {
+		if (size >> d) {
+			c = names[i];
+			break;
+		}
 	}
 
-	n = size / d;
+	if (!c) {
+		sprintf(buf, "%llu Bytes", size);
+		return buf;
+	}
+
+	n = size >> d;
+	f = size & ((1ULL << d) - 1);
 
-	m = (10 * (size - (n * d)) + (d / 2) ) / d;
+	/* If there's a remainder, deal with it */
+	if (f) {
+		m = (10ULL * f + (1ULL << (d - 1))) >> d;
 
-	if (m >= 10) {
-		m -= 10;
-		n += 1;
+		if (m >= 10) {
+			m -= 10;
+			n += 1;
+		}
 	}
 
-	ptr += sprintf(buf, "%2ld", n);
+	ptr += sprintf(buf, "%lu", n);
 	if (m) {
-		ptr += sprintf (ptr,".%ld", m);
+		ptr += sprintf(ptr, ".%ld", m);
 	}
-	sprintf(ptr, " %cB", c);
+	sprintf(ptr, " %ciB", c);
 
 	return buf;
 }
-- 
1.7.10.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

  parent reply	other threads:[~2012-12-17 15:48 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-17 15:48 [PATCH V3 00/11] ubiformat for barebox Wolfram Sang
2012-12-17 15:48 ` [PATCH V3 01/11] mtd: drop custom is_power_of_2() Wolfram Sang
2012-12-17 15:48 ` [PATCH V3 02/11] lib: misc: add 'iB' suffixes to strtoull_suffix Wolfram Sang
2012-12-17 15:48 ` Wolfram Sang [this message]
2012-12-17 15:48 ` [PATCH V3 04/11] ubi: consolidate ubi-media.h Wolfram Sang
2012-12-17 15:48 ` [PATCH V3 05/11] ubi: bump ubi-media.h to newest version Wolfram Sang
2012-12-17 15:48 ` [PATCH V3 06/11] devfs & mtd: add MEMERASE ioctl support Wolfram Sang
2012-12-17 15:48 ` [PATCH V3 07/11] mtd: utils: apply macros for message printouts Wolfram Sang
2012-12-17 15:48 ` [PATCH V3 08/11] lib: add libscan Wolfram Sang
2012-12-17 15:48 ` [PATCH V3 09/11] lib: add libubigen Wolfram Sang
2012-12-17 15:48 ` [PATCH V3 10/11] lib: add barebox version of libmtd Wolfram Sang
2012-12-17 15:48 ` [PATCH V3 11/11] commands: add ubiformat Wolfram Sang
2012-12-19 11:50 ` [PATCH V3 00/11] ubiformat for barebox Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1355759313-23329-4-git-send-email-w.sang@pengutronix.de \
    --to=w.sang@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox