59 lines · c
1// SPDX-License-Identifier: GPL-2.02#include "print_binary.h"3#include <linux/log2.h>4#include <linux/ctype.h>5 6int binary__fprintf(unsigned char *data, size_t len,7 size_t bytes_per_line, binary__fprintf_t printer,8 void *extra, FILE *fp)9{10 size_t i, j, mask;11 int printed = 0;12 13 if (!printer)14 return 0;15 16 bytes_per_line = roundup_pow_of_two(bytes_per_line);17 mask = bytes_per_line - 1;18 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);24 }25 26 printed += printer(BINARY_PRINT_NUM_DATA, data[i], extra, fp);27 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);31 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);38 }39 }40 printed += printer(BINARY_PRINT_DATA_END, -1, extra, fp);41 return printed;42}43 44int is_printable_array(char *p, unsigned int len)45{46 unsigned int i;47 48 if (!p || !len || p[len - 1] != 0)49 return 0;50 51 len--;52 53 for (i = 0; i < len && p[i]; i++) {54 if (!isprint(p[i]) && !isspace(p[i]))55 return 0;56 }57 return 1;58}59