summaryrefslogtreecommitdiffstats
path: root/common/memory_display.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2018-11-30 09:22:02 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2018-12-03 08:37:33 +0100
commite2e9582916f44319a861afe6338da518aa66fd36 (patch)
treefb941e1efa6b21daa706fcfbe165b7b612a2aeea /common/memory_display.c
parentd6c62b739b35744de673d5fdb573ffdabc7d9a8d (diff)
downloadbarebox-e2e9582916f44319a861afe6338da518aa66fd36.tar.gz
memory_display: Print whole line at once
Instead of using many printf assemble a printed line first and print it at once. This has the purpose of being able to pick different output functions in the next step. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common/memory_display.c')
-rw-r--r--common/memory_display.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/common/memory_display.c b/common/memory_display.c
index 30821cc..03d418b 100644
--- a/common/memory_display.c
+++ b/common/memory_display.c
@@ -8,6 +8,7 @@ int memory_display(const void *addr, loff_t offs, unsigned nbytes, int size, int
{
unsigned long linebytes, i;
unsigned char *cp;
+ unsigned char line[sizeof("00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................")];
/* Print the lines.
*
@@ -20,9 +21,9 @@ int memory_display(const void *addr, loff_t offs, unsigned nbytes, int size, int
uint32_t *uip = (uint32_t *)linebuf;
uint16_t *usp = (uint16_t *)linebuf;
uint8_t *ucp = (uint8_t *)linebuf;
- unsigned count = 52;
+ unsigned char *pos = line;
- printf("%08llx:", offs);
+ pos += sprintf(pos, "%08llx:", offs);
linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes;
for (i = 0; i < linebytes; i += size) {
@@ -34,9 +35,9 @@ int memory_display(const void *addr, loff_t offs, unsigned nbytes, int size, int
res = __swab64(res);
if (data_abort_unmask()) {
res = 0xffffffffffffffffULL;
- count -= printf(" xxxxxxxxxxxxxxxx");
+ pos += sprintf(pos, " xxxxxxxxxxxxxxxx");
} else {
- count -= printf(" %016llx", res);
+ pos += sprintf(pos, " %016llx", res);
}
*ullp++ = res;
} else if (size == 4) {
@@ -47,9 +48,9 @@ int memory_display(const void *addr, loff_t offs, unsigned nbytes, int size, int
res = __swab32(res);
if (data_abort_unmask()) {
res = 0xffffffff;
- count -= printf(" xxxxxxxx");
+ pos += sprintf(pos, " xxxxxxxx");
} else {
- count -= printf(" %08x", res);
+ pos += sprintf(pos, " %08x", res);
}
*uip++ = res;
} else if (size == 2) {
@@ -59,12 +60,12 @@ int memory_display(const void *addr, loff_t offs, unsigned nbytes, int size, int
if (swab)
res = __swab16(res);
if (i > 1 && i % 8 == 0)
- count -= printf(" ");
+ pos += sprintf(pos, " ");
if (data_abort_unmask()) {
res = 0xffff;
- count -= printf(" xxxx");
+ pos += sprintf(pos, " xxxx");
} else {
- count -= printf(" %04x", res);
+ pos += sprintf(pos, " %04x", res);
}
*usp++ = res;
} else {
@@ -72,12 +73,12 @@ int memory_display(const void *addr, loff_t offs, unsigned nbytes, int size, int
data_abort_mask();
res = *((uint8_t *)addr);
if (i > 1 && i % 8 == 0)
- count -= printf(" ");
+ pos += sprintf(pos, " ");
if (data_abort_unmask()) {
res = 0xff;
- count -= printf(" xx");
+ pos += sprintf(pos, " xx");
} else {
- count -= printf(" %02x", res);
+ pos += sprintf(pos, " %02x", res);
}
*ucp++ = res;
}
@@ -85,19 +86,19 @@ int memory_display(const void *addr, loff_t offs, unsigned nbytes, int size, int
offs += size;
}
- while (count--)
- putchar(' ');
+ pos += sprintf(pos, "%*s", 61 - (pos - line), "");
cp = linebuf;
for (i = 0; i < linebytes; i++) {
if ((*cp < 0x20) || (*cp > 0x7e))
- putchar('.');
+ sprintf(pos, ".");
else
- printf("%c", *cp);
+ sprintf(pos, "%c", *cp);
+ pos++;
cp++;
}
- putchar('\n');
+ printf("%s\n", line);
nbytes -= linebytes;
if (ctrlc())
return -EINTR;