]>
Commit | Line | Data |
---|---|---|
6ff66f50 PC |
1 | /* |
2 | * Helper to hexdump a buffer | |
3 | * | |
4 | * Copyright (c) 2013 Red Hat, Inc. | |
5 | * Copyright (c) 2013 Gerd Hoffmann <kraxel@redhat.com> | |
6 | * Copyright (c) 2013 Peter Crosthwaite <peter.crosthwaite@xilinx.com> | |
7 | * Copyright (c) 2013 Xilinx, Inc | |
8 | * | |
9 | * This work is licensed under the terms of the GNU GPL, version 2. See | |
10 | * the COPYING file in the top-level directory. | |
11 | * | |
12 | * Contributions after 2012-01-13 are licensed under the terms of the | |
13 | * GNU GPL, version 2 or (at your option) any later version. | |
14 | */ | |
15 | ||
aafd7584 | 16 | #include "qemu/osdep.h" |
415b7327 | 17 | #include "qemu/cutils.h" |
6ff66f50 | 18 | |
bbb16908 LV |
19 | void qemu_hexdump_line(char *line, unsigned int b, const void *bufptr, |
20 | unsigned int len, bool ascii) | |
6ff66f50 | 21 | { |
67263b33 | 22 | const char *buf = bufptr; |
bbb16908 | 23 | int i, c; |
6ff66f50 | 24 | |
bbb16908 LV |
25 | if (len > QEMU_HEXDUMP_LINE_BYTES) { |
26 | len = QEMU_HEXDUMP_LINE_BYTES; | |
27 | } | |
28 | ||
29 | line += snprintf(line, 6, "%04x:", b); | |
30 | for (i = 0; i < QEMU_HEXDUMP_LINE_BYTES; i++) { | |
31 | if ((i % 4) == 0) { | |
32 | *line++ = ' '; | |
6ff66f50 | 33 | } |
bbb16908 LV |
34 | if (i < len) { |
35 | line += sprintf(line, " %02x", (unsigned char)buf[b + i]); | |
36 | } else { | |
37 | line += sprintf(line, " "); | |
6ff66f50 | 38 | } |
bbb16908 LV |
39 | } |
40 | if (ascii) { | |
41 | *line++ = ' '; | |
a1555559 IL |
42 | for (i = 0; i < len; i++) { |
43 | c = buf[b + i]; | |
44 | if (c < ' ' || c > '~') { | |
45 | c = '.'; | |
46 | } | |
bbb16908 | 47 | *line++ = c; |
6ff66f50 | 48 | } |
6ff66f50 | 49 | } |
bbb16908 LV |
50 | *line = '\0'; |
51 | } | |
52 | ||
53 | void qemu_hexdump(FILE *fp, const char *prefix, | |
54 | const void *bufptr, size_t size) | |
55 | { | |
56 | unsigned int b, len; | |
57 | char line[QEMU_HEXDUMP_LINE_LEN]; | |
58 | ||
59 | for (b = 0; b < size; b += QEMU_HEXDUMP_LINE_BYTES) { | |
60 | len = size - b; | |
61 | qemu_hexdump_line(line, b, bufptr, len, true); | |
62 | fprintf(fp, "%s: %s\n", prefix, line); | |
63 | } | |
64 | ||
6ff66f50 | 65 | } |