aboutsummaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorLaurent Vivier <lvivier@redhat.com>2020-09-25 11:10:54 +0200
committerMichael S. Tsirkin <mst@redhat.com>2020-09-29 02:14:30 -0400
commitbbb169080fe55947b40f8e035eb205316e9b29a5 (patch)
tree241ab665b8b75d6dd25074e4d3f0d9864b271e00 /util
parentf68ec01fe965e8c06ce6181fe28e1a9bef352cff (diff)
util/hexdump: introduce qemu_hexdump_line()
Dumping one line of hexadecimal/ASCII from a buffer is often needed. Move this part from qemu_hexdump() and use it Acked-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Laurent Vivier <lvivier@redhat.com> Message-Id: <20200925091055.186023-2-lvivier@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'util')
-rw-r--r--util/hexdump.c54
1 files changed, 34 insertions, 20 deletions
diff --git a/util/hexdump.c b/util/hexdump.c
index 0b4662e701..2c105a8846 100644
--- a/util/hexdump.c
+++ b/util/hexdump.c
@@ -16,36 +16,50 @@
#include "qemu/osdep.h"
#include "qemu-common.h"
-void qemu_hexdump(FILE *fp, const char *prefix,
- const void *bufptr, size_t size)
+void qemu_hexdump_line(char *line, unsigned int b, const void *bufptr,
+ unsigned int len, bool ascii)
{
const char *buf = bufptr;
- unsigned int b, len, i, c;
+ int i, c;
- for (b = 0; b < size; b += 16) {
- len = size - b;
- if (len > 16) {
- len = 16;
+ if (len > QEMU_HEXDUMP_LINE_BYTES) {
+ len = QEMU_HEXDUMP_LINE_BYTES;
+ }
+
+ line += snprintf(line, 6, "%04x:", b);
+ for (i = 0; i < QEMU_HEXDUMP_LINE_BYTES; i++) {
+ if ((i % 4) == 0) {
+ *line++ = ' ';
}
- fprintf(fp, "%s: %04x:", prefix, b);
- for (i = 0; i < 16; i++) {
- if ((i % 4) == 0) {
- fprintf(fp, " ");
- }
- if (i < len) {
- fprintf(fp, " %02x", (unsigned char)buf[b + i]);
- } else {
- fprintf(fp, " ");
- }
+ if (i < len) {
+ line += sprintf(line, " %02x", (unsigned char)buf[b + i]);
+ } else {
+ line += sprintf(line, " ");
}
- fprintf(fp, " ");
+ }
+ if (ascii) {
+ *line++ = ' ';
for (i = 0; i < len; i++) {
c = buf[b + i];
if (c < ' ' || c > '~') {
c = '.';
}
- fprintf(fp, "%c", c);
+ *line++ = c;
}
- fprintf(fp, "\n");
}
+ *line = '\0';
+}
+
+void qemu_hexdump(FILE *fp, const char *prefix,
+ const void *bufptr, size_t size)
+{
+ unsigned int b, len;
+ char line[QEMU_HEXDUMP_LINE_LEN];
+
+ for (b = 0; b < size; b += QEMU_HEXDUMP_LINE_BYTES) {
+ len = size - b;
+ qemu_hexdump_line(line, b, bufptr, len, true);
+ fprintf(fp, "%s: %s\n", prefix, line);
+ }
+
}