Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools lib: Add bitmap_scnprintf function

Add support to print bitmap list. Code mostly taken from kernel's
bitmap_list_string.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1470074555-24889-3-git-send-email-jolsa@kernel.org
[ s/bitmap_snprintf/bitmap_scnprintf/g as it is a scnprintf wrapper, having the same semantics wrt return value ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Jiri Olsa and committed by
Arnaldo Carvalho de Melo
820d12b7 98c03296

+39
+10
tools/include/linux/bitmap.h
··· 75 75 return calloc(1, BITS_TO_LONGS(nbits) * sizeof(unsigned long)); 76 76 } 77 77 78 + /* 79 + * bitmap_scnprintf - print bitmap list into buffer 80 + * @bitmap: bitmap 81 + * @nbits: size of bitmap 82 + * @buf: buffer to store output 83 + * @size: size of @buf 84 + */ 85 + size_t bitmap_scnprintf(unsigned long *bitmap, int nbits, 86 + char *buf, size_t size); 87 + 78 88 #endif /* _PERF_BITOPS_H */
+29
tools/lib/bitmap.c
··· 29 29 for (k = 0; k < nr; k++) 30 30 dst[k] = bitmap1[k] | bitmap2[k]; 31 31 } 32 + 33 + size_t bitmap_scnprintf(unsigned long *bitmap, int nbits, 34 + char *buf, size_t size) 35 + { 36 + /* current bit is 'cur', most recently seen range is [rbot, rtop] */ 37 + int cur, rbot, rtop; 38 + bool first = true; 39 + size_t ret = 0; 40 + 41 + rbot = cur = find_first_bit(bitmap, nbits); 42 + while (cur < nbits) { 43 + rtop = cur; 44 + cur = find_next_bit(bitmap, nbits, cur + 1); 45 + if (cur < nbits && cur <= rtop + 1) 46 + continue; 47 + 48 + if (!first) 49 + ret += scnprintf(buf + ret, size - ret, ","); 50 + 51 + first = false; 52 + 53 + ret += scnprintf(buf + ret, size - ret, "%d", rbot); 54 + if (rbot < rtop) 55 + ret += scnprintf(buf + ret, size - ret, "-%d", rtop); 56 + 57 + rbot = cur; 58 + } 59 + return ret; 60 + }