|
@@ -29,3 +29,32 @@ void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
|
|
|
for (k = 0; k < nr; k++)
|
|
|
dst[k] = bitmap1[k] | bitmap2[k];
|
|
|
}
|
|
|
+
|
|
|
+size_t bitmap_scnprintf(unsigned long *bitmap, int nbits,
|
|
|
+ char *buf, size_t size)
|
|
|
+{
|
|
|
+ /* current bit is 'cur', most recently seen range is [rbot, rtop] */
|
|
|
+ int cur, rbot, rtop;
|
|
|
+ bool first = true;
|
|
|
+ size_t ret = 0;
|
|
|
+
|
|
|
+ rbot = cur = find_first_bit(bitmap, nbits);
|
|
|
+ while (cur < nbits) {
|
|
|
+ rtop = cur;
|
|
|
+ cur = find_next_bit(bitmap, nbits, cur + 1);
|
|
|
+ if (cur < nbits && cur <= rtop + 1)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (!first)
|
|
|
+ ret += scnprintf(buf + ret, size - ret, ",");
|
|
|
+
|
|
|
+ first = false;
|
|
|
+
|
|
|
+ ret += scnprintf(buf + ret, size - ret, "%d", rbot);
|
|
|
+ if (rbot < rtop)
|
|
|
+ ret += scnprintf(buf + ret, size - ret, "-%d", rtop);
|
|
|
+
|
|
|
+ rbot = cur;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+}
|