Patchwork [U-Boot] display_options:print_buffer: align ASCII print

login
register
mail settings
Submitter Andreas Bießmann
Date Feb. 7, 2013, 2:58 p.m.
Message ID <1360249099-28309-1-git-send-email-andreas.devel@googlemail.com>
Download mbox | patch
Permalink /patch/218937/
State Accepted
Delegated to: Tom Rini
Headers show

Comments

Andreas Bießmann - Feb. 7, 2013, 2:58 p.m.
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(-)

Patch

diff --git a/lib/display_options.c b/lib/display_options.c
index 694d2f2..d03933a 100644
--- a/lib/display_options.c
+++ b/lib/display_options.c
@@ -114,14 +114,15 @@  int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen)
 		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;
@@ -133,8 +134,15 @@  int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen)
 			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] = '.';
 		}
@@ -142,8 +150,8 @@  int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen)
 		printf("    %s\n", lb.uc);
 
 		/* update references */
-		addr += linelen * width;
-		count -= linelen;
+		addr += thislinelen * width;
+		count -= thislinelen;
 
 		if (ctrlc())
 			return -1;