brintos

brintos / linux-shallow public Read only

0
0
Text · 1.5 KiB · 13fdc51 Raw
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