[PATCH] libosmocore[master]: Replace bitvec_set_uint() with bitvec_set_u64()

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/.

Max gerrit-no-reply at lists.osmocom.org
Mon Oct 23 09:56:54 UTC 2017


Hello Jenkins Builder,

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

    https://gerrit.osmocom.org/4337

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

Replace bitvec_set_uint() with bitvec_set_u64()

Old bitvec_set_uint() uses "unsigned int" as input parameter which
length is not guaranteed. It does not allow to specify which bit_value
to set and does not check for incorrect length. Overall this makes it
harder to re-use and more error-prone.

Let's replace it with extended implementation which uses fixed type
length parameters and extra checks. The additional parameter allows
caller to explicitly indicate the need to use L/H instead of 0/1 for bit
vector elements. It's necessary to properly encode some of the messages
from 3GPP TS 44.018, for example §10.5.2.16 IA Rest Octets.

The old function is left for backward compatibility as a tiny wrapper
around new function and will be deprecated in follow-up patches.

Change-Id: I1b670dacb55fb3063271d045f9faa10fccba10a6
Related: OS#1526
---
M include/osmocom/core/bitvec.h
M src/bitvec.c
2 files changed, 28 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/37/4337/2

diff --git a/include/osmocom/core/bitvec.h b/include/osmocom/core/bitvec.h
index d4c7d68..19466ab 100644
--- a/include/osmocom/core/bitvec.h
+++ b/include/osmocom/core/bitvec.h
@@ -28,6 +28,7 @@
 
 #include <stdint.h>
 #include <osmocom/core/talloc.h>
+#include <osmocom/core/defs.h>
 #include <stdbool.h>
 
 /*! A single GSM bit
@@ -57,6 +58,7 @@
 int bitvec_set_bit(struct bitvec *bv, enum bit_value bit);
 int bitvec_get_bit_high(struct bitvec *bv);
 int bitvec_set_bits(struct bitvec *bv, const enum bit_value *bits, unsigned int count);
+int bitvec_set_u64(struct bitvec *bv, uint64_t v, uint8_t num_bits, bool use_lh);
 int bitvec_set_uint(struct bitvec *bv, unsigned int in, unsigned int count);
 int bitvec_get_uint(struct bitvec *bv, unsigned int num_bits);
 int bitvec_find_bit_pos(const struct bitvec *bv, unsigned int n, enum bit_value val);
diff --git a/src/bitvec.c b/src/bitvec.c
index f07b42c..24049cd 100644
--- a/src/bitvec.c
+++ b/src/bitvec.c
@@ -215,24 +215,41 @@
 	return 0;
 }
 
-/*! set multiple bits (based on numeric value) at current pos
- *  \return 0 in case of success; negative in case of error */
-int bitvec_set_uint(struct bitvec *bv, unsigned int ui, unsigned int num_bits)
+/*! set multiple bits (based on numeric value) at current pos.
+ *  \param[in] bv bit vector.
+ *  \param[in] v mask representing which bits needs to be set.
+ *  \param[in] num_bits number of meaningful bits in the mask.
+ *  \param[in] use_lh whether to interpret the bits as L/H values or as 0/1.
+ *  \return 0 on success; negative in case of error. */
+int bitvec_set_u64(struct bitvec *bv, uint64_t v, uint8_t num_bits, bool use_lh)
 {
-	int rc;
-	unsigned i;
+	uint8_t i;
+
+	if (num_bits > 64)
+		return -E2BIG;
+
 	for (i = 0; i < num_bits; i++) {
-		int bit = 0;
-		if (ui & (1u << (num_bits - i - 1)))
-			bit = 1;
+		int rc;
+		enum bit_value bit = use_lh ? L : 0;
+
+		if (v & ((uint64_t)1 << (num_bits - i - 1)))
+			bit = use_lh ? H : 1;
+
 		rc = bitvec_set_bit(bv, bit);
-		if (rc)
+		if (rc != 0)
 			return rc;
 	}
 
 	return 0;
 }
 
+/*! set multiple bits (based on numeric value) at current pos.
+ *  \return 0 in case of success; negative in case of error. */
+int bitvec_set_uint(struct bitvec *bv, unsigned int ui, unsigned int num_bits)
+{
+	return bitvec_set_u64(bv, ui, num_bits, false);
+}
+
 /*! get multiple bits (num_bits) from beginning of vector (MSB side)
  *  \return 16bit signed integer retrieved from bit vector */
 int16_t bitvec_get_int16_msb(const struct bitvec *bv, unsigned int num_bits)

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

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I1b670dacb55fb3063271d045f9faa10fccba10a6
Gerrit-PatchSet: 2
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Max <msuraev at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Minh-Quang Nguyen <minh-quang.nguyen at nutaq.com>
Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr at sysmocom.de>



More information about the gerrit-log mailing list