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
Review at https://gerrit.osmocom.org/4337
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 old function is left for
backward compatibility as a tiny wrapper around new function.
Change-Id: I1b670dacb55fb3063271d045f9faa10fccba10a6
Related: OS#1526
---
M include/osmocom/core/bitvec.h
M src/bitvec.c
2 files changed, 27 insertions(+), 8 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/37/4337/1
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..aa7bdea 100644
--- a/src/bitvec.c
+++ b/src/bitvec.c
@@ -216,23 +216,40 @@
}
/*! 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)
+ * \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: newchange
Gerrit-Change-Id: I1b670dacb55fb3063271d045f9faa10fccba10a6
Gerrit-PatchSet: 1
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Max <msuraev at sysmocom.de>