[PATCH] 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/.

pravin gerrit-no-reply at lists.osmocom.org
Fri Nov 11 10:50:37 UTC 2016


Hello Harald Welte, arvind.sirsikar, Jenkins Builder, Holger Freyther,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/415

to look at the new patch set (#6).

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, 64 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/15/415/6

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..ba19e1f 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);
+}
+
 /*! \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..11656ad 100644
--- a/tests/bitvec/bitvec_test.c
+++ b/tests/bitvec/bitvec_test.c
@@ -150,6 +150,14 @@
 	}
 }
 
+static inline void test_bitvec_rl_curbit(struct bitvec *bv, bool b, int max_bits,
+						int result )
+{
+	int num = 0;
+	num = bitvec_rl_curbit(bv, b, max_bits);
+	OSMO_ASSERT (num == result);
+}
+
 static void test_array()
 {
 	struct bitvec b;
@@ -245,6 +253,14 @@
 
 	test_array();
 
+	printf ("bitvec_runlength....\n");
+
+	bitvec_zero(&bv);
+	bitvec_set_uint(&bv, 0xff, 8);
+	bv.cur_bit -= 8;
+	test_bitvec_rl_curbit(&bv, 1, 64, 8);
+	test_bitvec_rl_curbit(&bv,0 , 64, 56);
+
 	printf("\nbitvec ok.\n");
 
 	return 0;
diff --git a/tests/bitvec/bitvec_test.ok b/tests/bitvec/bitvec_test.ok
index e256108..c6faf13 100644
--- a/tests/bitvec/bitvec_test.ok
+++ b/tests/bitvec/bitvec_test.ok
@@ -165,5 +165,6 @@
 11.1..1. 11111111 ..11.111 .11.111. ..1.111. 1...11.. 11.11.11 11.1.... 1111111. ........ ........ ........ ........ ........ ........ 
 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
-........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
+........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ bitvec_runlength....
+
 bitvec ok.

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

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: Iae153d3639ea6b891c1fc10d7801a435c9492e26
Gerrit-PatchSet: 6
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: Max <msuraev at sysmocom.de>
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