xref: /openbmc/linux/tools/perf/util/print_binary.c (revision 65db92e0965ab56e8031d5c804f26d5be0e47047)
1 #include "print_binary.h"
2 #include <linux/log2.h>
3 #include "sane_ctype.h"
4 
5 int binary__fprintf(unsigned char *data, size_t len,
6 		    size_t bytes_per_line, binary__fprintf_t printer,
7 		    void *extra, FILE *fp)
8 {
9 	size_t i, j, mask;
10 	int printed = 0;
11 
12 	if (!printer)
13 		return 0;
14 
15 	bytes_per_line = roundup_pow_of_two(bytes_per_line);
16 	mask = bytes_per_line - 1;
17 
18 	printed += printer(BINARY_PRINT_DATA_BEGIN, 0, extra, fp);
19 	for (i = 0; i < len; i++) {
20 		if ((i & mask) == 0) {
21 			printed += printer(BINARY_PRINT_LINE_BEGIN, -1, extra, fp);
22 			printed += printer(BINARY_PRINT_ADDR, i, extra, fp);
23 		}
24 
25 		printed += printer(BINARY_PRINT_NUM_DATA, data[i], extra, fp);
26 
27 		if (((i & mask) == mask) || i == len - 1) {
28 			for (j = 0; j < mask-(i & mask); j++)
29 				printed += printer(BINARY_PRINT_NUM_PAD, -1, extra, fp);
30 
31 			printer(BINARY_PRINT_SEP, i, extra, fp);
32 			for (j = i & ~mask; j <= i; j++)
33 				printed += printer(BINARY_PRINT_CHAR_DATA, data[j], extra, fp);
34 			for (j = 0; j < mask-(i & mask); j++)
35 				printed += printer(BINARY_PRINT_CHAR_PAD, i, extra, fp);
36 			printed += printer(BINARY_PRINT_LINE_END, -1, extra, fp);
37 		}
38 	}
39 	printed += printer(BINARY_PRINT_DATA_END, -1, extra, fp);
40 	return printed;
41 }
42 
43 int is_printable_array(char *p, unsigned int len)
44 {
45 	unsigned int i;
46 
47 	if (!p || !len || p[len - 1] != 0)
48 		return 0;
49 
50 	len--;
51 
52 	for (i = 0; i < len; i++) {
53 		if (!isprint(p[i]) && !isspace(p[i]))
54 			return 0;
55 	}
56 	return 1;
57 }
58