1#include <stddef.h>
 2
 3#include "dump.h"
 4
 5
 6static bool same_16_chars(uint8_t* block, uint8_t chr)
 7/*
 8 * Check if 16 bytes of the block are equal to chr.
 9 */
10{
11    for (unsigned i = 0; i < 16; i++ ) {
12        if (block[i] != chr) {
13            return false;
14        }
15    }
16    return true;
17}
18
19void dump_bitmap(FILE* fp, uint8_t* data, unsigned size)
20{
21    bool prev_row_same_char = false;
22    uint8_t prev_row_char = 0;
23    bool skipping = false;
24    unsigned column = 0;
25    for (unsigned i = 0; i < size;) {
26        if (column == 0) {
27            if (prev_row_same_char && size - i > 16
28                && (prev_row_char == 0 || prev_row_char == 0xFF)
29                && same_16_chars(data + i, prev_row_char)) {
30                i += 16;
31                if (!skipping) {
32                    skipping = true;
33                    fputs("---\n",  fp);
34                }
35                continue;
36            }
37            prev_row_same_char = true;
38            prev_row_char = data[i];
39            skipping = false;
40            fprintf(fp, "%p: ", (void*) (((ptrdiff_t) data) + i));
41        }
42        if (prev_row_char != data[i]) {
43            prev_row_same_char = false;
44        }
45        uint8_t b = data[i++];
46        for (unsigned j = 0; j < 8; j++) {
47            if (b & 1) {
48                fputc('*', fp);
49            } else {
50                fputc('.', fp);
51            }
52            b >>= 1;
53        }
54        column++;
55        if (column == 8) {
56            fputc(' ', fp);
57        } else if (column == 16) {
58            fputc('\n', fp);
59            column = 0;
60        } else {
61            fputc(' ', fp);
62        }
63    }
64    if (column < 16) {
65        fputc('\n', fp);
66    }
67}