diff options
author | Laurent Vivier <lvivier@redhat.com> | 2020-09-25 11:10:54 +0200 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2020-09-29 02:14:30 -0400 |
commit | bbb169080fe55947b40f8e035eb205316e9b29a5 (patch) | |
tree | 241ab665b8b75d6dd25074e4d3f0d9864b271e00 | |
parent | f68ec01fe965e8c06ce6181fe28e1a9bef352cff (diff) | |
download | qemu-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.h | 8 | ||||
-rw-r--r-- | util/hexdump.c | 54 |
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); + } + } |