[MERGED] libosmocore[master]: Add function to get uninterrupted bit run

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Fri Jan 6 10:37:42 UTC 2017


Harald Welte has submitted this change and it was merged.

Change subject: Add function to get uninterrupted bit run
......................................................................


Add function to get uninterrupted bit run

Function bitvec_rl_curbit added to get number of  uninterrupted
bits run in vector starting from the current bit till max number
of bits.
Test case is added to check bitvec_rl_curbit.

Change-Id: Iae153d3639ea6b891c1fc10d7801a435c9492e26
---
M include/osmocom/core/bitvec.h
M src/bitvec.c
M tests/bitvec/bitvec_test.c
M tests/bitvec/bitvec_test.ok
4 files changed, 89 insertions(+), 1 deletion(-)

Approvals:
  arvind.sirsikar: Looks good to me, but someone else must approve; Verified
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/include/osmocom/core/bitvec.h b/include/osmocom/core/bitvec.h
index 19e2af8..0e17ba7 100644
--- a/include/osmocom/core/bitvec.h
+++ b/include/osmocom/core/bitvec.h
@@ -89,6 +89,7 @@
 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 38148ac..c895cff 100644
--- a/src/bitvec.c
+++ b/src/bitvec.c
@@ -575,6 +575,51 @@
 	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 a98a91c..d0bc30c 100644
--- a/tests/bitvec/bitvec_test.c
+++ b/tests/bitvec/bitvec_test.c
@@ -150,6 +150,18 @@
 	}
 }
 
+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 @@
 
 	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 e256108..6281973 100644
--- a/tests/bitvec/bitvec_test.ok
+++ b/tests/bitvec/bitvec_test.ok
@@ -166,4 +166,6 @@
 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
+bitvec_runlength....
+
 bitvec ok.

-- 
To view, visit https://gerrit.osmocom.org/415
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Iae153d3639ea6b891c1fc10d7801a435c9492e26
Gerrit-PatchSet: 12
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: prasadkg <Prasad.Kaup at radisys.com>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Holger Freyther <holger at freyther.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: arvind.sirsikar <arvind.sirsikar at radisys.com>
Gerrit-Reviewer: prasadkg <Prasad.Kaup at radisys.com>
Gerrit-Reviewer: pravin <pravin.manoharan at radisys.com>



More information about the gerrit-log mailing list