extern void cpuset_free(cpu_set_t *set);
extern char *cpulist_create(char *str, size_t len, cpu_set_t *set, size_t setsize);
+extern char *cpulist_flat_create(char *str, size_t len, cpu_set_t *set, size_t setsize);
extern int cpulist_parse(const char *str, cpu_set_t *set, size_t setsize, int fail);
extern char *cpumask_create(char *str, size_t len, cpu_set_t *set, size_t setsize);
return str;
}
+/*
+ * cpulist_flat_create - Convert cpumask to flat comma-separated list
+ * Output: ONLY single CPUs, NO ranges (e.g. "0,1,2,3,4")
+ */
+char *cpulist_flat_create(char *str, size_t len,
+ cpu_set_t *set, size_t setsize)
+{
+ char *ptr = str;
+ int entry_made = 0;
+ size_t max = cpuset_nbits(setsize);
+ size_t cpu;
+ int rlen;
+
+ for (cpu = 0; cpu < max; cpu++) {
+ if (!CPU_ISSET_S(cpu, setsize, set))
+ continue;
+
+ rlen = snprintf(ptr, len, "%zu,", cpu);
+ if (rlen < 0 || (size_t)rlen >= len)
+ return NULL;
+
+ ptr += rlen;
+ len -= rlen;
+ entry_made = 1;
+ }
+ ptr -= entry_made;
+ *ptr = '\0';
+
+ return str;
+}
+
+
/*
* Returns string with CPU mask.
*/
Print the combined arguments as a hexadecimal mask value
in 32-bit comma-separated groups.
+*-e*, *--expand*::
+Print the combined arguments as a list of individual bit IDs.
+
*-l*, *--list*::
Print the combined arguments as a list of bit IDs.
Consecutive IDs are compressed to ranges.
~$ bits --grouped-mask 2,22,74,79
8400,00000000,00400004
+~$ bits --expand 1,3-5,7
+1,3,4,5,7
+
~$ bits --width 64 --list 2,22,74,79
2,22
....
enum output_mode {
MODE_BINARY,
+ MODE_EXPAND,
MODE_GROUPED_MASK,
MODE_LIST,
MODE_MASK,
case MODE_BINARY:
printf("0b0\n");
break;
+ case MODE_EXPAND:
case MODE_LIST:
break;
}
printf("\n");
break;
+ case MODE_EXPAND:
case MODE_LIST:
- /* Maximum number of digits (larger bit number) plus 1
- * to account for a separating comma, times the number of bits
- * set to 1. */
buf_size = (num_digits(width - 1) + 1) * CPU_COUNT_S(size, bits);
buf = xmalloc(buf_size);
- cpulist_create(buf, buf_size, bits, size);
+ if (mode == MODE_EXPAND)
+ cpulist_flat_create(buf, buf_size, bits, size);
+ else
+ cpulist_create(buf, buf_size, bits, size);
printf("%s\n", buf);
break;
}
" comma separated groups"), stdout);
fputsln(_(" -b, --binary display bits as a binary mask value"),
stdout);
+ fputsln(_(" -e, --expand display bits as an expanded list of bit IDs"), stdout);
fputsln(_(" -l, --list display bits as a compressed list of bit IDs"),
stdout);
size_t alloc_size;
int c;
-#define FLAGS "Vhw:mgbl"
+#define FLAGS "Vhw:mgble"
static const struct option longopts[] = {
{ "version", no_argument, NULL, 'V' },
{ "help", no_argument, NULL, 'h' },
{ "mask", no_argument, NULL, 'm' },
{ "grouped-mask", no_argument, NULL, 'g' },
{ "binary", no_argument, NULL, 'b' },
+ { "expand", no_argument, NULL, 'e' },
{ "list", no_argument, NULL, 'l' },
{ NULL, 0, NULL, 0 }
};
case 'b':
mode = MODE_BINARY;
break;
+ case 'e':
+ mode = MODE_EXPAND;
+ break;
case 'l':
mode = MODE_LIST;
break;