xref: /openbmc/qemu/util/hexdump.c (revision 415b7327)
16ff66f50SPeter Crosthwaite /*
26ff66f50SPeter Crosthwaite  * Helper to hexdump a buffer
36ff66f50SPeter Crosthwaite  *
46ff66f50SPeter Crosthwaite  * Copyright (c) 2013 Red Hat, Inc.
56ff66f50SPeter Crosthwaite  * Copyright (c) 2013 Gerd Hoffmann <kraxel@redhat.com>
66ff66f50SPeter Crosthwaite  * Copyright (c) 2013 Peter Crosthwaite <peter.crosthwaite@xilinx.com>
76ff66f50SPeter Crosthwaite  * Copyright (c) 2013 Xilinx, Inc
86ff66f50SPeter Crosthwaite  *
96ff66f50SPeter Crosthwaite  * This work is licensed under the terms of the GNU GPL, version 2.  See
106ff66f50SPeter Crosthwaite  * the COPYING file in the top-level directory.
116ff66f50SPeter Crosthwaite  *
126ff66f50SPeter Crosthwaite  * Contributions after 2012-01-13 are licensed under the terms of the
136ff66f50SPeter Crosthwaite  * GNU GPL, version 2 or (at your option) any later version.
146ff66f50SPeter Crosthwaite  */
156ff66f50SPeter Crosthwaite 
16aafd7584SPeter Maydell #include "qemu/osdep.h"
17*415b7327SMarc-André Lureau #include "qemu/cutils.h"
186ff66f50SPeter Crosthwaite 
qemu_hexdump_line(char * line,unsigned int b,const void * bufptr,unsigned int len,bool ascii)19bbb16908SLaurent Vivier void qemu_hexdump_line(char *line, unsigned int b, const void *bufptr,
20bbb16908SLaurent Vivier                        unsigned int len, bool ascii)
216ff66f50SPeter Crosthwaite {
2267263b33SPhilippe Mathieu-Daudé     const char *buf = bufptr;
23bbb16908SLaurent Vivier     int i, c;
246ff66f50SPeter Crosthwaite 
25bbb16908SLaurent Vivier     if (len > QEMU_HEXDUMP_LINE_BYTES) {
26bbb16908SLaurent Vivier         len = QEMU_HEXDUMP_LINE_BYTES;
276ff66f50SPeter Crosthwaite     }
28bbb16908SLaurent Vivier 
29bbb16908SLaurent Vivier     line += snprintf(line, 6, "%04x:", b);
30bbb16908SLaurent Vivier     for (i = 0; i < QEMU_HEXDUMP_LINE_BYTES; i++) {
31a1555559SIsaac Lozano         if ((i % 4) == 0) {
32bbb16908SLaurent Vivier             *line++ = ' ';
336ff66f50SPeter Crosthwaite         }
34a1555559SIsaac Lozano         if (i < len) {
35bbb16908SLaurent Vivier             line += sprintf(line, " %02x", (unsigned char)buf[b + i]);
36a1555559SIsaac Lozano         } else {
37bbb16908SLaurent Vivier             line += sprintf(line, "   ");
386ff66f50SPeter Crosthwaite         }
396ff66f50SPeter Crosthwaite     }
40bbb16908SLaurent Vivier     if (ascii) {
41bbb16908SLaurent Vivier         *line++ = ' ';
42a1555559SIsaac Lozano         for (i = 0; i < len; i++) {
43a1555559SIsaac Lozano             c = buf[b + i];
44a1555559SIsaac Lozano             if (c < ' ' || c > '~') {
45a1555559SIsaac Lozano                 c = '.';
46a1555559SIsaac Lozano             }
47bbb16908SLaurent Vivier             *line++ = c;
48a1555559SIsaac Lozano         }
496ff66f50SPeter Crosthwaite     }
50bbb16908SLaurent Vivier     *line = '\0';
51bbb16908SLaurent Vivier }
52bbb16908SLaurent Vivier 
qemu_hexdump(FILE * fp,const char * prefix,const void * bufptr,size_t size)53bbb16908SLaurent Vivier void qemu_hexdump(FILE *fp, const char *prefix,
54bbb16908SLaurent Vivier                   const void *bufptr, size_t size)
55bbb16908SLaurent Vivier {
56bbb16908SLaurent Vivier     unsigned int b, len;
57bbb16908SLaurent Vivier     char line[QEMU_HEXDUMP_LINE_LEN];
58bbb16908SLaurent Vivier 
59bbb16908SLaurent Vivier     for (b = 0; b < size; b += QEMU_HEXDUMP_LINE_BYTES) {
60bbb16908SLaurent Vivier         len = size - b;
61bbb16908SLaurent Vivier         qemu_hexdump_line(line, b, bufptr, len, true);
62bbb16908SLaurent Vivier         fprintf(fp, "%s: %s\n", prefix, line);
63bbb16908SLaurent Vivier     }
64bbb16908SLaurent Vivier 
656ff66f50SPeter Crosthwaite }
66