summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/core/bitvec.h1
-rw-r--r--src/bitvec.c45
-rw-r--r--tests/bitvec/bitvec_test.c42
-rw-r--r--tests/bitvec/bitvec_test.ok2
4 files changed, 89 insertions, 1 deletions
diff --git a/include/osmocom/core/bitvec.h b/include/osmocom/core/bitvec.h
index 19e2af8a..0e17ba7a 100644
--- a/include/osmocom/core/bitvec.h
+++ b/include/osmocom/core/bitvec.h
@@ -89,6 +89,7 @@ char bit_value_to_char(enum bit_value v);
void bitvec_to_string_r(const struct bitvec *bv, char *str);
void bitvec_zero(struct bitvec *bv);
unsigned bitvec_rl(const struct bitvec *bv, bool b);
+unsigned bitvec_rl_curbit(struct bitvec *bv, bool b, int max_bits);
void bitvec_shiftl(struct bitvec *bv, unsigned int n);
int16_t bitvec_get_int16_msb(const struct bitvec *bv, unsigned int num_bits);
unsigned int bitvec_add_array(struct bitvec *bv, const uint32_t *array,
diff --git a/src/bitvec.c b/src/bitvec.c
index 38148acb..c895cffa 100644
--- a/src/bitvec.c
+++ b/src/bitvec.c
@@ -575,6 +575,51 @@ unsigned bitvec_rl(const struct bitvec *bv, bool b)
return bv->cur_bit;
}
+/*! \brief Return number (bits) of uninterrupted bit run in vector
+ * starting from the current bit
+ * \param[in] bv The boolean vector to work on
+ * \param[in] b The boolean, sequence of 1's or 0's to be checked
+ * \param[in] max_bits Total Number of Uncmopresed bits
+ * \returns Number of consecutive bits of \p b in \p bv and cur_bit will
+ * \go to cur_bit + number of consecutive bit
+ */
+unsigned bitvec_rl_curbit(struct bitvec *bv, bool b, int max_bits)
+{
+ unsigned i = 0;
+ unsigned j = 8;
+ int temp_res = 0;
+ int count = 0;
+ unsigned readIndex = bv->cur_bit;
+ unsigned remaining_bits = max_bits % 8;
+ unsigned remaining_bytes = max_bits / 8;
+ unsigned byte_mask = 0xFF;
+
+ if (readIndex % 8) {
+ for (j -= (readIndex % 8) ; j > 0 ; j--) {
+ if (readIndex < max_bits && bitvec_read_field(bv, &readIndex, 1) == b)
+ temp_res++;
+ else {
+ bv->cur_bit--;
+ return temp_res;
+ }
+ }
+ }
+ for (i = (readIndex / 8);
+ i < (remaining_bits ? remaining_bytes + 1 : remaining_bytes);
+ i++, count++) {
+ if ((b ? byte_mask : 0) != bv->data[i]) {
+ bv->cur_bit = (count * 8 +
+ leading_bits(bv->data[i], b) + readIndex);
+ return count * 8 +
+ leading_bits(bv->data[i], b) + temp_res;
+ }
+ }
+ bv->cur_bit = (temp_res + (count * 8)) + readIndex;
+ if (bv->cur_bit > max_bits)
+ bv->cur_bit = max_bits;
+ return (bv->cur_bit - readIndex + temp_res);
+}
+
/*! \brief Shifts bitvec to the left, n MSB bits lost */
void bitvec_shiftl(struct bitvec *bv, unsigned n)
{
diff --git a/tests/bitvec/bitvec_test.c b/tests/bitvec/bitvec_test.c
index a98a91c6..d0bc30c4 100644
--- a/tests/bitvec/bitvec_test.c
+++ b/tests/bitvec/bitvec_test.c
@@ -150,6 +150,18 @@ static inline void test_array_item(unsigned t, struct bitvec *b, unsigned int n,
}
}
+static inline void test_bitvec_rl_curbit(struct bitvec *bv, bool b, int max_bits,
+ int result )
+{
+ int num = 0;
+ int readIndex = bv->cur_bit;
+ OSMO_ASSERT(bv->cur_bit < max_bits);
+ num = bitvec_rl_curbit(bv, b, max_bits);
+ readIndex += num;
+ OSMO_ASSERT(bv->cur_bit == readIndex);
+ OSMO_ASSERT(num == result);
+}
+
static void test_array()
{
struct bitvec b;
@@ -245,7 +257,35 @@ int main(int argc, char **argv)
test_array();
- printf("\nbitvec ok.\n");
+ printf("\nbitvec_runlength....\n");
+ bitvec_zero(&bv);
+ bitvec_set_uint(&bv, 0xff, 8);
+ bv.cur_bit -= 8;
+ test_bitvec_rl_curbit(&bv, 1, 64, 8);
+
+ bitvec_zero(&bv);
+ bitvec_set_uint(&bv, 0xfc, 8);
+ bv.cur_bit -= 8;
+ test_bitvec_rl_curbit(&bv, 1, 64, 6);
+
+ bitvec_zero(&bv);
+ test_bitvec_rl_curbit(&bv, 0, 52, 52);
+
+ bitvec_zero(&bv);
+ bitvec_set_uint(&bv, 0xfc, 8);
+ bv.cur_bit -= 2;
+ test_bitvec_rl_curbit(&bv, 0, 64, 58);
+
+ bitvec_zero(&bv);
+ bitvec_set_uint(&bv, 0x07, 8);
+ bitvec_set_uint(&bv, 0xf8, 8);
+ bv.cur_bit -= 11;
+ test_bitvec_rl_curbit(&bv, 1, 64, 8);
+
+ bitvec_zero(&bv);
+ test_bitvec_rl_curbit(&bv, 1, 64, 0);
+
+ printf("\nbitvec ok.\n");
return 0;
}
diff --git a/tests/bitvec/bitvec_test.ok b/tests/bitvec/bitvec_test.ok
index e2561089..62819736 100644
--- a/tests/bitvec/bitvec_test.ok
+++ b/tests/bitvec/bitvec_test.ok
@@ -166,4 +166,6 @@ bits: 17, est: 1153, real: 1153, x: 0, y: 0
........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........
+bitvec_runlength....
+
bitvec ok.