1 // SPDX-License-Identifier: GPL-2.0
2 #include "print_binary.h"
3 #include <linux/log2.h>
4 #include <linux/ctype.h>
6 int binary__fprintf(unsigned char *data
, size_t len
,
7 size_t bytes_per_line
, binary__fprintf_t printer
,
16 bytes_per_line
= roundup_pow_of_two(bytes_per_line
);
17 mask
= bytes_per_line
- 1;
19 printed
+= printer(BINARY_PRINT_DATA_BEGIN
, 0, extra
, fp
);
20 for (i
= 0; i
< len
; i
++) {
21 if ((i
& mask
) == 0) {
22 printed
+= printer(BINARY_PRINT_LINE_BEGIN
, -1, extra
, fp
);
23 printed
+= printer(BINARY_PRINT_ADDR
, i
, extra
, fp
);
26 printed
+= printer(BINARY_PRINT_NUM_DATA
, data
[i
], extra
, fp
);
28 if (((i
& mask
) == mask
) || i
== len
- 1) {
29 for (j
= 0; j
< mask
-(i
& mask
); j
++)
30 printed
+= printer(BINARY_PRINT_NUM_PAD
, -1, extra
, fp
);
32 printer(BINARY_PRINT_SEP
, i
, extra
, fp
);
33 for (j
= i
& ~mask
; j
<= i
; j
++)
34 printed
+= printer(BINARY_PRINT_CHAR_DATA
, data
[j
], extra
, fp
);
35 for (j
= 0; j
< mask
-(i
& mask
); j
++)
36 printed
+= printer(BINARY_PRINT_CHAR_PAD
, i
, extra
, fp
);
37 printed
+= printer(BINARY_PRINT_LINE_END
, -1, extra
, fp
);
40 printed
+= printer(BINARY_PRINT_DATA_END
, -1, extra
, fp
);
44 int is_printable_array(char *p
, unsigned int len
)
48 if (!p
|| !len
|| p
[len
- 1] != 0)
53 for (i
= 0; i
< len
&& p
[i
]; i
++) {
54 if (!isprint(p
[i
]) && !isspace(p
[i
]))