mirror of https://gerrit.osmocom.org/libosmocore
bitvec_read_field(): indicate errors using errno
This function returns an *unsigned* integer (uint64_t), so returning a negative value on error is a bad idea. A negative value turns into a huge positive value, what was demonstrated in the bitvec_test: bitvec_read_field(idx=512, len=16) => ffffffffffffffea bitvec_read_field(idx=0, len=65) => ffffffffffffffea bitvec_read_field(idx=64, len=16) => ffffffffffffffea The 0xffffffffffffffea above is basically: (uint64_t) -EINVAL, or (uint64_t) -22 + 1, or 0xffffffffffffffff - 0x16 + 1. Let's make use of the errno in order to indicate an error to the caller. Change-Id: I2cc734caa3365d03c2ae2b3f2cd9544933c25e9e Related: OS#4388
This commit is contained in:
parent
2768246e7a
commit
de3549a234
11
src/bitvec.c
11
src/bitvec.c
|
@ -472,18 +472,23 @@ int bitvec_unhex(struct bitvec *bv, const char *src)
|
|||
* \param[in] bv The boolean vector to work on
|
||||
* \param[in,out] read_index Where reading supposed to start in the vector
|
||||
* \param[in] len How many bits to read from vector
|
||||
* \returns read bits or negative value on error
|
||||
* \returns An integer made up of the bits read.
|
||||
*
|
||||
* In case of an error, errno is set to a non-zero value. Otherwise it holds 0.
|
||||
*/
|
||||
uint64_t bitvec_read_field(struct bitvec *bv, unsigned int *read_index, unsigned int len)
|
||||
{
|
||||
unsigned int i;
|
||||
uint64_t ui = 0;
|
||||
bv->cur_bit = *read_index;
|
||||
errno = 0;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
int bit = bitvec_get_bit_pos((const struct bitvec *)bv, bv->cur_bit);
|
||||
if (bit < 0)
|
||||
return bit;
|
||||
if (bit < 0) {
|
||||
errno = -bit;
|
||||
break;
|
||||
}
|
||||
if (bit)
|
||||
ui |= ((uint64_t)1 << (len - i - 1));
|
||||
bv->cur_bit++;
|
||||
|
|
|
@ -237,7 +237,8 @@ static void test_bitvec_read_field(void)
|
|||
#define _bitvec_read_field(idx, len) \
|
||||
readIndex = idx; \
|
||||
field = bitvec_read_field(&bv, &readIndex, len); \
|
||||
printf("bitvec_read_field(idx=%u, len=%u) => %" PRIx64 "\n", idx, len, field);
|
||||
printf("bitvec_read_field(idx=%u, len=%u) => %" PRIx64 " (%s)\n", \
|
||||
idx, len, field, errno == 0 ? "success" : "error");
|
||||
|
||||
_bitvec_read_field(0, 64);
|
||||
_bitvec_read_field(0, 32);
|
||||
|
|
|
@ -171,21 +171,21 @@ bitvec_runlength....
|
|||
bitvec bytes used.
|
||||
|
||||
test bitvec_read_field():
|
||||
bitvec_read_field(idx=0, len=64) => deadbeeffeebdaed
|
||||
bitvec_read_field(idx=0, len=32) => deadbeef
|
||||
bitvec_read_field(idx=0, len=16) => dead
|
||||
bitvec_read_field(idx=0, len=8) => de
|
||||
bitvec_read_field(idx=0, len=0) => 0
|
||||
bitvec_read_field(idx=8, len=8) => ad
|
||||
bitvec_read_field(idx=8, len=4) => a
|
||||
bitvec_read_field(idx=8, len=0) => 0
|
||||
bitvec_read_field(idx=10, len=9) => 16d
|
||||
bitvec_read_field(idx=10, len=7) => 5b
|
||||
bitvec_read_field(idx=10, len=5) => 16
|
||||
bitvec_read_field(idx=10, len=3) => 5
|
||||
bitvec_read_field(idx=10, len=1) => 1
|
||||
bitvec_read_field(idx=512, len=16) => ffffffffffffffea
|
||||
bitvec_read_field(idx=0, len=65) => ffffffffffffffea
|
||||
bitvec_read_field(idx=64, len=16) => ffffffffffffffea
|
||||
bitvec_read_field(idx=0, len=64) => deadbeeffeebdaed (success)
|
||||
bitvec_read_field(idx=0, len=32) => deadbeef (success)
|
||||
bitvec_read_field(idx=0, len=16) => dead (success)
|
||||
bitvec_read_field(idx=0, len=8) => de (success)
|
||||
bitvec_read_field(idx=0, len=0) => 0 (success)
|
||||
bitvec_read_field(idx=8, len=8) => ad (success)
|
||||
bitvec_read_field(idx=8, len=4) => a (success)
|
||||
bitvec_read_field(idx=8, len=0) => 0 (success)
|
||||
bitvec_read_field(idx=10, len=9) => 16d (success)
|
||||
bitvec_read_field(idx=10, len=7) => 5b (success)
|
||||
bitvec_read_field(idx=10, len=5) => 16 (success)
|
||||
bitvec_read_field(idx=10, len=3) => 5 (success)
|
||||
bitvec_read_field(idx=10, len=1) => 1 (success)
|
||||
bitvec_read_field(idx=512, len=16) => 0 (error)
|
||||
bitvec_read_field(idx=0, len=65) => bd5b7ddffdd7b5db (error)
|
||||
bitvec_read_field(idx=64, len=16) => 0 (error)
|
||||
|
||||
bitvec ok.
|
||||
|
|
Loading…
Reference in New Issue