linux/tools/perf/util/print_binary.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#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