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}