From efd7c11404e59874d4da86d04cab4acacf77d793 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Andreas=20Bie=C3=9Fmann?= <andreas.devel@googlemail.com>
Date: Thu, 7 Feb 2013 04:58:19 +0000
Subject: [PATCH] display_options:print_buffer: align ASCII print
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

This patch adds whitespace to the printed hex numbers to have an aligned ASCII
printout at the end of the line.

This changes for example the md output from:

---8<---
OMAP3 Tricorder # md.l $loadaddr 5
82000000: 30200109 20a4028c 90010000 08a00000    .. 0... ........
82000010: 01010000    ....
--->8---

to

---8<---
OMAP3 Tricorder # md.l $loadaddr 5
82000000: 30200109 20a4028c 90010000 08a00000    .. 0... ........
82000010: 01010000                               ....
--->8---

The cost of this is about 72 byte .text increase (tested with at91 build).

Signed-off-by: Andreas Bießmann <andreas.devel@googlemail.com>
---
 lib/display_options.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/lib/display_options.c b/lib/display_options.c
index 0339970e7d..e6d684bd60 100644
--- a/lib/display_options.c
+++ b/lib/display_options.c
@@ -115,14 +115,15 @@ int print_buffer(ulong addr, const void *data, uint width, uint count,
 		linelen = DEFAULT_LINE_LENGTH_BYTES / width;
 
 	while (count) {
+		uint thislinelen = linelen;
 		printf("%08lx:", addr);
 
 		/* check for overflow condition */
-		if (count < linelen)
-			linelen = count;
+		if (count < thislinelen)
+			thislinelen = count;
 
 		/* Copy from memory into linebuf and print hex values */
-		for (i = 0; i < linelen; i++) {
+		for (i = 0; i < thislinelen; i++) {
 			uint32_t x;
 			if (width == 4)
 				x = lb.ui[i] = *(volatile uint32_t *)data;
@@ -134,8 +135,15 @@ int print_buffer(ulong addr, const void *data, uint width, uint count,
 			data += width;
 		}
 
+		while (thislinelen < linelen) {
+			/* fill line with whitespace for nice ASCII print */
+			for (i=0; i<width*2+1; i++)
+				puts(" ");
+			linelen--;
+		}
+
 		/* Print data in ASCII characters */
-		for (i = 0; i < linelen * width; i++) {
+		for (i = 0; i < thislinelen * width; i++) {
 			if (!isprint(lb.uc[i]) || lb.uc[i] >= 0x80)
 				lb.uc[i] = '.';
 		}
@@ -143,8 +151,8 @@ int print_buffer(ulong addr, const void *data, uint width, uint count,
 		printf("    %s\n", lb.uc);
 
 		/* update references */
-		addr += linelen * width;
-		count -= linelen;
+		addr += thislinelen * width;
+		count -= thislinelen;
 
 		if (ctrlc())
 			return -1;
-- 
2.39.5