* GNU GPL, version 2 or (at your option) any later version.
*/
+#include "qemu/osdep.h"
#include "qemu-common.h"
-void qemu_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);
}
+
}