Skip to content
Snippets Groups Projects
Commit 7a3160d1 authored by Tim Wickberg's avatar Tim Wickberg
Browse files

Add bitstr2inx function to convert bitstrings into int32_t array format.

parent 409ab31f
No related branches found
No related tags found
No related merge requests found
...@@ -1159,6 +1159,49 @@ int inx2bitstr(bitstr_t *b, int32_t *inx) ...@@ -1159,6 +1159,49 @@ int inx2bitstr(bitstr_t *b, int32_t *inx)
return rc; 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 /* bit_fmt_hexmask
* *
* Given a bitstr_t, allocate and return a string in the form of: * Given a bitstr_t, allocate and return a string in the form of:
......
...@@ -127,6 +127,7 @@ int bit_unfmt(bitstr_t *b, char *str); ...@@ -127,6 +127,7 @@ int bit_unfmt(bitstr_t *b, char *str);
int32_t *bitfmt2int (char *bit_str_ptr); int32_t *bitfmt2int (char *bit_str_ptr);
char * inx2bitfmt (int32_t *inx); char * inx2bitfmt (int32_t *inx);
int inx2bitstr(bitstr_t *b, int32_t *inx); int inx2bitstr(bitstr_t *b, int32_t *inx);
int32_t *bitstr2inx(bitstr_t *b);
char *bit_fmt_hexmask(bitstr_t *b); char *bit_fmt_hexmask(bitstr_t *b);
int bit_unfmt_hexmask(bitstr_t *b, const char *str); int bit_unfmt_hexmask(bitstr_t *b, const char *str);
char *bit_fmt_binmask(bitstr_t *b); char *bit_fmt_binmask(bitstr_t *b);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment