summaryrefslogtreecommitdiff
path: root/src/hexdump.c
blob: 76543969cd1e730303b77052ba888f1f54b38190 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* Hex dump utility
 *
 * \copyright
 * Copyright 2016-2017 Red Hat Inc. All rights reserved.
 */
#include <config.h>
#include <stdint.h>
#include <ctype.h>

#include "hexdump.h"

void hexdump(const void *ptr, size_t size, FILE *f_out)
{
    const uint8_t *buffer = (const uint8_t *) ptr;
    unsigned long sum = 0;

    for (size_t n = 0; n < size;) {
        int i;
        enum { BYTES_PER_LINE = 16 };
        char s[BYTES_PER_LINE + 1], hexstring[BYTES_PER_LINE * 3 + 1];

        fprintf(f_out, "%04X  ", (unsigned) n);
        for (i = 0; n < size && i < BYTES_PER_LINE; i++, n++) {
            uint8_t c = buffer[n];
            sum += c;
            sprintf(hexstring + i * 3, "%02X ", c);
            s[i] = isprint(c) ? c : '.';
        }
        s[i] = '\0';
        fprintf(f_out, "%*s\t%s\n", (int) (-3 * BYTES_PER_LINE), hexstring, s);
    }
    fprintf(f_out, "sum = %lu\n", sum);
}