aboutsummaryrefslogtreecommitdiff
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
parentf68ec01fe965e8c06ce6181fe28e1a9bef352cff (diff)
downloadqemu-bbb169080fe55947b40f8e035eb205316e9b29a5.zip
qemu-bbb169080fe55947b40f8e035eb205316e9b29a5.tar.gz
qemu-bbb169080fe55947b40f8e035eb205316e9b29a5.tar.bz2
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>
-rw-r--r--include/qemu-common.h8
-rw-r--r--util/hexdump.c54
2 files changed, 42 insertions, 20 deletions
diff --git a/include/qemu-common.h b/include/qemu-common.h
index 9cfd626..cc902b6 100644
--- a/include/qemu-common.h
+++ b/include/qemu-common.h
@@ -135,6 +135,14 @@ char *os_find_datadir(void);
int os_parse_cmd_args(int index, const char *optarg);
/*
+ * Hexdump a line of a byte buffer into a hexadecimal/ASCII buffer
+ */
+#define QEMU_HEXDUMP_LINE_BYTES 16 /* Number of bytes to dump */
+#define QEMU_HEXDUMP_LINE_LEN 75 /* Number of characters in line */
+void qemu_hexdump_line(char *line, unsigned int b, const void *bufptr,
+ unsigned int len, bool ascii);
+
+/*
* Hexdump a buffer to a file. An optional string prefix is added to every line
*/
diff --git a/util/hexdump.c b/util/hexdump.c
index 0b4662e..2c105a8 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);
+ }
+
}