print_binary.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include "print_binary.h"
  3. #include <linux/log2.h>
  4. #include <linux/ctype.h>
  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. if (!printer)
  12. return 0;
  13. bytes_per_line = roundup_pow_of_two(bytes_per_line);
  14. mask = bytes_per_line - 1;
  15. printed += printer(BINARY_PRINT_DATA_BEGIN, 0, extra, fp);
  16. for (i = 0; i < len; i++) {
  17. if ((i & mask) == 0) {
  18. printed += printer(BINARY_PRINT_LINE_BEGIN, -1, extra, fp);
  19. printed += printer(BINARY_PRINT_ADDR, i, extra, fp);
  20. }
  21. printed += printer(BINARY_PRINT_NUM_DATA, data[i], extra, fp);
  22. if (((i & mask) == mask) || i == len - 1) {
  23. for (j = 0; j < mask-(i & mask); j++)
  24. printed += printer(BINARY_PRINT_NUM_PAD, -1, extra, fp);
  25. printer(BINARY_PRINT_SEP, i, extra, fp);
  26. for (j = i & ~mask; j <= i; j++)
  27. printed += printer(BINARY_PRINT_CHAR_DATA, data[j], extra, fp);
  28. for (j = 0; j < mask-(i & mask); j++)
  29. printed += printer(BINARY_PRINT_CHAR_PAD, i, extra, fp);
  30. printed += printer(BINARY_PRINT_LINE_END, -1, extra, fp);
  31. }
  32. }
  33. printed += printer(BINARY_PRINT_DATA_END, -1, extra, fp);
  34. return printed;
  35. }
  36. int is_printable_array(char *p, unsigned int len)
  37. {
  38. unsigned int i;
  39. if (!p || !len || p[len - 1] != 0)
  40. return 0;
  41. len--;
  42. for (i = 0; i < len && p[i]; i++) {
  43. if (!isprint(p[i]) && !isspace(p[i]))
  44. return 0;
  45. }
  46. return 1;
  47. }