X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=util%2Fhexdump.c;h=9921114b3c75a7ead393cdd5e650e9f750284b70;hb=fdc2b46abaa81415a8e6d8439bdd0c3d1b930373;hp=0d0efc86dec647203c85ab9fcbbab38f3c83ebd2;hpb=e531761d63b7f8fe6b6423fafb3616ebbff768aa;p=mirror_qemu.git diff --git a/util/hexdump.c b/util/hexdump.c index 0d0efc86de..9921114b3c 100644 --- a/util/hexdump.c +++ b/util/hexdump.c @@ -13,25 +13,53 @@ * GNU GPL, version 2 or (at your option) any later version. */ -#include "qemu-common.h" +#include "qemu/osdep.h" +#include "qemu/cutils.h" -void hexdump(const char *buf, FILE *fp, const char *prefix, size_t size) +void qemu_hexdump_line(char *line, unsigned int b, const void *bufptr, + unsigned int len, bool ascii) { - unsigned int b; + const char *buf = bufptr; + int i, c; - for (b = 0; b < size; b++) { - if ((b % 16) == 0) { - fprintf(fp, "%s: %04x:", prefix, b); + 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++ = ' '; } - if ((b % 4) == 0) { - fprintf(fp, " "); + if (i < len) { + line += sprintf(line, " %02x", (unsigned char)buf[b + i]); + } else { + line += sprintf(line, " "); } - fprintf(fp, " %02x", (unsigned char)buf[b]); - if ((b % 16) == 15) { - fprintf(fp, "\n"); + } + if (ascii) { + *line++ = ' '; + for (i = 0; i < len; i++) { + c = buf[b + i]; + if (c < ' ' || c > '~') { + c = '.'; + } + *line++ = c; } } - if ((b % 16) != 0) { - 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); } + }