From 7a3160d1f50dbc00ae2222845aaf71e80dd3aba8 Mon Sep 17 00:00:00 2001 From: Tim Wickberg <tim@schedmd.com> Date: Thu, 12 Jan 2017 23:49:56 -0500 Subject: [PATCH] Add bitstr2inx function to convert bitstrings into int32_t array format. --- src/common/bitstring.c | 43 ++++++++++++++++++++++++++++++++++++++++++ src/common/bitstring.h | 1 + 2 files changed, 44 insertions(+) diff --git a/src/common/bitstring.c b/src/common/bitstring.c index 66f421bf927..7c14452cf0b 100644 --- a/src/common/bitstring.c +++ b/src/common/bitstring.c @@ -1159,6 +1159,49 @@ int inx2bitstr(bitstr_t *b, int32_t *inx) return rc; } +/* + * convert a bitstring to inx format + * returns an xmalloc()'d array of int32_t that must be xfree()'d + */ +int32_t *bitstr2inx(bitstr_t *b) +{ + bitoff_t start, bit, pos = 0; + int32_t *bit_inx; + + if (!b) { + bit_inx = xmalloc(sizeof(int32_t)); + bit_inx[0] = -1; + return bit_inx; + } + + /* worst case: every other bit set, resulting in an array of length + * bitstr_bits(b) + 1 (if an odd number of elements) + * + 1 (for trailing -1) */ + bit_inx = xmalloc_nz(sizeof(int32_t) * (_bitstr_bits(b) + 2)); + + for (bit = 0; bit < _bitstr_bits(b); ) { + /* skip past empty words */ + if (!b[_bit_word(bit)]) { + bit += sizeof(bitstr_t) * 8; + continue; + } + + if (bit_test(b, bit)) { + start = bit; + while (bit + 1 < _bitstr_bits(b) + && bit_test(b, bit + 1)) + bit++; + bit_inx[pos++] = start; + bit_inx[pos++] = bit; + } + bit++; + } + /* terminate array with -1 */ + bit_inx[pos] = -1; + + return bit_inx; +} + /* bit_fmt_hexmask * * Given a bitstr_t, allocate and return a string in the form of: diff --git a/src/common/bitstring.h b/src/common/bitstring.h index b287e1cfbaa..14cb9e57206 100644 --- a/src/common/bitstring.h +++ b/src/common/bitstring.h @@ -127,6 +127,7 @@ int bit_unfmt(bitstr_t *b, char *str); int32_t *bitfmt2int (char *bit_str_ptr); char * inx2bitfmt (int32_t *inx); int inx2bitstr(bitstr_t *b, int32_t *inx); +int32_t *bitstr2inx(bitstr_t *b); char *bit_fmt_hexmask(bitstr_t *b); int bit_unfmt_hexmask(bitstr_t *b, const char *str); char *bit_fmt_binmask(bitstr_t *b); -- GitLab